Захват сигнала Qt5 в слот генерирует сигнал ошибки времени выполнения: не существует

У меня есть программа на Qt5, которая просто создает и запускает мой класс (я думаю, что это должен быть класс, чтобы воспользоваться механизмом сигнала / слота, но я не уверен, что это актуально для моей конкретной проблемы ):

int main(int argc, char *argv[]) {
    MyApp myApp;
    return myApp.run(argc, argv);
}

В самом классе я создаю экземпляр QGuiApplication, а затем пытаюсь захватить его сигнал изменения состояния:

class MyApp : public QObject {
public:
    MyApp() { }
    ~MyApp() { }
    int run(int argc, char *argv[]) {
        QGuiApplication app(argc, argv);
        connect(
            app,  SIGNAL(applicationStateChanged(Qt::ApplicationState)),
            this, SLOT(stateChanged(Qt::ApplicationState)));

        // blah blah blah

        return app.exec();
    }
public slots:
    void stateChanged(Qt::ApplicationState newState) {
        std::cout << "State changed to " << newState << '\n';
    }
};

Теперь, насколько я понимаю, это должно соединить сигнал от объекта QGuiApplication с функцией слота в объекте MyApp. Но я явно делаю что-то не так, так как во время выполнения жалуется, что сигнал не существует:

QObject::connect:
    No such signal QObject::applicationStateChanged(Qt::ApplicationState)
        in Prog.cpp:16

Qobject:: в имени сигнала немного беспокоит. Я бы подумал, что это будет QGuiApplication, но, поскольку я новичок в этом материале Qt, я не уверен, что это проблема.

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


person paxdiablo    schedule 01.08.2016    source источник
comment
Кстати, создание QObjects перед созданием QCoreApplication не совсем поддерживается. Почему у вас такая странная инкапсуляция?   -  person peppe    schedule 02.08.2016


Ответы (1)


Чтобы сигналы работали, нужно использовать макрос Q_OBJECT в начале первого закрытого раздела производного от QObject класса.

class MyApp : public QObject {
  Q_OBJECT
  public:
    // ...
}

См. Документы Qt 5.x на Q_OBJECT

person Torbjörn    schedule 01.08.2016
comment
Это дает мне массу ошибок времени компиляции формы no matching function for call to ‘MyApp::connect(QGuiApplication&, const char*, MyApp*, const char*)’. Но, похоже, это потому, что app находится в стеке, а не указатель. Итак, как только я передаю &app, а не app, он работает нормально. Ваше здоровье. - person paxdiablo; 01.08.2016
comment
Вы используете компилятор MOC перед вызовом компилятора C ++, верно? - person Torbjörn; 01.08.2016