Возможно ли подключить сигнал к статическому слоту без экземпляра приемника?
Можно ли подключить сигнал к статическому слоту без экземпляра приемника?
Пример: 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();
};
Возможно, Фрэнк Остерфельд прав, и в этом случае лучше использовать шаблон singleton, но я все еще удивлен, почему эта функция еще не реализована.
Update:
В Qt 5 можно.
Ответы
Ответ 1
Обновление для 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
файлы в вашем проекте, это говорит само по себе.
Ответ 2
Это. (С 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();
}
Ответ 3
В более ранних версиях Qt, хотя вы не можете сделать так, как упоминалось в @UmNyobe, но вы можете сделать что-то вроде этого, если вы действительно хотите назвать этот статический слот:
connect(&object, SIGNAL(some()), this, SLOT(foo()));
void foo()
{
.... //call your static function here.
}