是否可以在没有接收器实例的情况下将信号连接到静态插槽?

时间:2012-02-24 09:05:05

标签: c++ qt qt4 signals-slots

是否可以在没有接收器实例的情况下将信号连接到静态插槽?

像这样: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是对的,在这种情况下最好使用单例模式,但我仍然感到惊讶为什么这个功能还没有实现。

更新

In Qt 5 it is possible

3 个答案:

答案 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.
}