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.
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.
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.
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.
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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With