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

34

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

像这样:connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

在Qt文档中有一个带有[静态槽]属性的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()));

如果一个类只有静态函数,是否允许执行相同的操作但不传递实例变量?

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

也许Frank Osterfeld是正确的,使用单例模式在这种情况下更好,但我仍然惊讶为什么这个功能还没有被实现。

更新:

在Qt 5中,这是可能的

3个回答

26

更新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文件,它会自己说明的。


是的。我不明白为什么在Qt元对象系统中无法在没有对象的情况下调用静态函数? 是的。我不明白为什么在Qt元对象系统中无法在没有对象的情况下调用静态函数? - bartolo-otrit
我同意这是Qt系统的一个缺点,但仍然不可能。 - UmNyobe
6
看不出有什么不利之处。具有副作用的静态函数本来就是邪恶的,并且如果需要,可以使用单例 QObject 实例。 - Frank Osterfeld
@FrankOsterfeld 我对此的问题在于,当与无法在cpp文件中声明QObject的事实相结合时,它需要向您的项目添加2个文件才能订阅信号。 - sashoalm
1
如果您正在使用Qt 5和C++11功能,那么现在可以使用带有lambda的信号。 - Frank Osterfeld
该函数不一定必须是静态的,请参考ManuelSchneid3r的答案。 - Anonymous

5

是的。 (使用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();
}

1
在早期版本的Qt中,虽然像@UmNyobe所提到的那样你不能这样做,但如果你真的想调用那个静态槽,你可以做类似于这样的事情:
connect(&object, SIGNAL(some()), this, SLOT(foo()));

void foo()
{
    .... //call your static function here.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接