Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to connect a signal to a static slot without a receiver instance?

Is it possible to connect a signal to static slot without receiver instance?

Like this: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

There is a QApplication::closeAllWindows() function with [static slot] attribute in Qt documentation. And there is an example of using it from the documentation:

exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcuts(QKeySequence::Quit); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 

Is it allowed to do the same action but without passing an instance variable (e.g. when a class has only static functions)?

class Some : public QObject {     Q_OBJECT public slots:     static void foo(); private:     Some(); }; 

Maybe Frank Osterfeld is right and it is better to use singleton pattern in this case but I am still surprised why this feature has not been implemented yet.

Update:

In Qt 5 it is possible.

like image 501
bartolo-otrit Avatar asked Feb 24 '12 09:02

bartolo-otrit


People also ask

What is signal slot connection?

A slot is called when a signal connected to it is emitted. Slots are normal C++ functions and can be called normally; their only special feature is that signals can be connected to them. Since slots are normal member functions, they follow the normal C++ rules when called directly.

In what order will the slots be executed if they are connected to one signal?

if several slots are connected to one signal, the slots will be executed one after the other, in the order they have been connected, when the signal is emitted.


2 Answers

Update for QT5: Yes you can

static void someFunction() {     qDebug() << "pressed"; } // ... somewhere else QObject::connect(button, &QPushButton::clicked, someFunction); 

In QT4 you can't:

No it is not allowed. Rather, it is allowed to use a slot which is a static function, but to be able to connect it you need an instance.

In their example,

connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 

means than they previously called

QApplication* qApp = QApplication::instance(); 

Edit:

The only interface for connecting object is the function

bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection ) 

How are you going to get rid of const QObject * receiver?

Check the moc files in your project, it speaks by itself.

like image 103
UmNyobe Avatar answered Sep 26 '22 02:09

UmNyobe


It is. (With Qt5)

#include <QApplication> #include <QDebug>  void foo(){     qDebug() << "focusChanged"; }   int main(int argc, char *argv[]) {     QApplication app(argc, argv);     QObject::connect(&app, &QApplication::focusChanged, foo);     return app.exec(); } 
like image 33
ManuelSchneid3r Avatar answered Sep 23 '22 02:09

ManuelSchneid3r