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

bar*_*rit 29 c++ qt qt4 signals-slots

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

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

QApplication::closeAllWindows()Qt文档中有一个带有[static slot]属性的函数.并且有一个从文档中使用它的示例:

exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
Run Code Online (Sandbox Code Playgroud)

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

class Some : public QObject {
    Q_OBJECT
public slots:
    static void foo();
private:
    Some();
};
Run Code Online (Sandbox Code Playgroud)

也许Frank Osterfeld是对的,在这种情况下最好使用单例模式但我仍然感到惊讶为什么这个功能还没有实现.

更新:

在Qt 5中,它是可能的.

UmN*_*obe 23

QT5更新:是的,你可以

static void someFunction() {
    qDebug() << "pressed";
}
// ... somewhere else
QObject::connect(button, &QPushButton::clicked, someFunction);
Run Code Online (Sandbox Code Playgroud)

在QT4中你不能:

不,不允许.相反,允许使用作为静态函数的插槽,但是为了能够连接它,您需要一个实例.

在他们的例子中,

connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
Run Code Online (Sandbox Code Playgroud)

意味着他们之前所说的

QApplication* qApp = QApplication::instance();
Run Code Online (Sandbox Code Playgroud)

编辑:

连接对象的唯一接口是函数

bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection )
Run Code Online (Sandbox Code Playgroud)

你打算怎么摆脱const QObject * receiver

检查moc项目中的文件,它自己说话.

  • 看不出太大的缺点.无论如何,带有副作用的静态函数都是邪恶的,如果需要,可以使用单例QObject实例. (6认同)

Man*_*d3r 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();
}
Run Code Online (Sandbox Code Playgroud)