2016-08-01 15 views
1

Ich habe ein Programm in Qt5, die einfach erstellt und führt meine Klasse (I denken es muss eine Klasse sein, um den Signal/Slot-Mechanismus zu nutzen aber ich bin nicht sicher, dass für mein spezielles Problem relevant ist):Qt5 Signal Capture zu Slot erzeugt Laufzeitfehler "Signal existiert nicht"

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

In der Klasse selbst, ich instanziiert ein QGuiApplication, dann versuchen, sein Zustandsänderungssignal zu erfassen:

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'; 
    } 
}; 

Jetzt, von dem, was ich verstehe, sollte dies c das Signal vom Objekt QGuiApplication bis zur Steckplatzfunktion im Objekt MyApp an. Aber ich mache offensichtlich etwas nicht in Ordnung, da es während der Laufzeit beschwert, dass das Signal nicht existiert:

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

Die Qobject:: im Signalnamen ist ein bisschen eine Sorge. Ich hätte gedacht, es wäre QGuiApplication, aber da ich neu in diesem Qt-Zeug bin, bin ich mir nicht sicher, ob das ein Problem ist.

Was ist der richtige Weg, um dieses Signal zu verbinden, so dass eine Änderung des Anwendungsstatus dazu führen würde, dass stateChanged aufgerufen wird?

+0

Es ist nicht genau unterstützt QObjects zu erstellen, bevor Sie eine QCoreApplication, nebenbei zu schaffen. Warum hast du diese seltsame Einkapselung? – peppe

Antwort

2

Damit Signale funktionieren, muss das Makro Q_OBJECT am Anfang des ersten privaten Abschnitts einer von QObject abgeleiteten Klasse verwendet werden.

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

Siehe Qt 5.x Docs on Q_OBJECT

+0

Das bringt mir einen Eimer von * Kompilieren * Zeitfehler der Form 'keine passende Funktion für den Aufruf von 'MyApp :: connect (QGuiApplication &, const char *, MyApp *, const char *)''. Aber es scheint, dass dies so ist, weil "app" auf dem Stapel und nicht ein Zeiger ist. Also, sobald ich "& App" statt "App" passiere, funktioniert es gut. Prost. – paxdiablo

+0

Sie verwenden den MOC-Compiler, bevor Sie den C++ - Compiler aufrufen, richtig? –