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

大城市里の小女人 提交于 2019-11-27 01:57:26
UmNyobe

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();
}

In earlier versions of Qt, although you cannot do so as mentioned by @UmNyobe but you can do something like this if you really want to call that static slot :

connect(&object, SIGNAL(some()), this, SLOT(foo()));

void foo()
{
    .... //call your static function here.
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!