Можно ли подключить сигнал к статическому слоту без экземпляра приемника? - PullRequest
28 голосов
/ 24 февраля 2012

Можно ли подключить сигнал к статическому слоту без экземпляра приемника?

Как это: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

В документации Qt есть функция QApplication::closeAllWindows() с атрибутом [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()));

Разрешено ли выполнять то же действие, но без передачи переменной экземпляра (например, когда класс имеет только статические функции)?

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

Возможно, Фрэнк Остерфельд прав, и в этом случае лучше использовать шаблон синглтона, но я все еще удивлен, почему эта функция еще не реализована.

Обновление:

В Qt 5 это возможно .

Ответы [ 3 ]

23 голосов
/ 24 февраля 2012

Обновление для 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 в вашем проекте, он говорит сам по себе.

4 голосов
/ 26 сентября 2016

Это. (С 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 голос
/ 03 января 2015

В более ранних версиях Qt, хотя вы не можете сделать это, как упомянуто @UmNyobe, но вы можете сделать что-то подобное, если вы действительно хотите вызвать этот статический слот:

connect(&object, SIGNAL(some()), this, SLOT(foo()));

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