是否可以在没有接收器实例的情况下将信号连接到静态插槽?
像这样:connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));
Qt文档中有[{1}}函数[static slot]属性。还有一个从文档中使用它的例子:
QApplication::closeAllWindows()
是否允许执行相同的操作但不传递实例变量(例如,当一个类只有静态函数时)?
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
也许Frank Osterfeld是对的,在这种情况下最好使用单例模式,但我仍然感到惊讶为什么这个功能还没有实现。
更新
答案 0 :(得分:23)
QT5更新:是的,您可以
static void someFunction() {
qDebug() << "pressed";
}
// ... somewhere else
QObject::connect(button, &QPushButton::clicked, someFunction);
在QT4中你不能:
不,不允许。相反,允许使用作为静态函数的插槽,但是为了能够连接它,您需要一个实例。
在他们的例子中,
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
意味着他们之前所说的
QApplication* qApp = QApplication::instance();
编辑:
连接对象的唯一接口是函数
bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection )
你打算如何摆脱const QObject * receiver
?
检查项目中的moc
个文件,它自己说话。
答案 1 :(得分:4)
It is.(使用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();
}
答案 2 :(得分:1)
在Qt的早期版本中,尽管你不能像@UmNyobe所提到的那样,但如果你真的想要调用那个静态插槽,你可以做这样的事情:
connect(&object, SIGNAL(some()), this, SLOT(foo()));
void foo()
{
.... //call your static function here.
}