QTimer :: singleShot () sucht nach dem angegebenen Slot in der übergeordneten Klasse des angegebenen Objekts, nicht nach dem Objekt selbst

8

Ich bin ziemlich neu in Qt. Ich habe einige einfache Änderungen an einer bestehenden Qt-Anwendung vorgenommen, aber ich habe noch keine von Grund auf neu erstellt.
Ich habe auch nicht wirklich viel Erfahrung mit bestimmten Aspekten von C ++ im Allgemeinen (Klassenvererbung usw.).

Ich habe ein neues Code :: Blocks Qt4-basiertes Projekt erstellt und die Vorlage ein wenig modifiziert. Ich habe zwei Dateien hinzugefügt.
Momentan enthält das Projekt drei Dateien: main.cpp, app.h und app.cpp.
Dies ist der Inhalt von main.cpp :

%Vor%

So sieht app.h aus:

%Vor%

Und das ist app.cpp :

%Vor%

Ich erwartete, dass das Programm eine Sekunde nach dem Start "timeout called" ausgibt. Leider funktioniert das nicht. Wenn QTimer::singleShot() aufgerufen wird, sagt die Konsole:

%Vor%

Ich habe keine Ahnung, wie ich damit umgehen soll. Vielen Dank im Voraus.

    
rhino 17.12.2011, 12:15
quelle

2 Antworten

6

Sie vermissen einfach das Makro Q_OBJECT in Ihrer TestApp-Klasse:

%Vor%

Dies ist notwendig, damit die gesamte Signal / Slot-Infrastruktur funktioniert (und von einer Klasse abstammt, die dieses Makro nicht besitzt).

(Stellen Sie sicher, dass Sie nach dieser Änderung einen vollständigen, sauberen Build erstellen - und wenn Sie qmake oder ein anderes Qt-aware Build-System nicht verwenden, müssen Sie moc selbst ausführen.)

Weitere Informationen finden Sie in der Dokumentation QObject :

  

Beachten Sie, dass das Makro Q_OBJECT für jedes Objekt obligatorisch ist, das Signale, Slots oder Eigenschaften implementiert. Sie müssen den Meta-Objekt-Compiler auch für die Quelldatei ausführen. Wir empfehlen dringend, dieses Makro in allen Unterklassen von QObject zu verwenden, unabhängig davon, ob sie tatsächlich Signale, Slots und Eigenschaften verwenden oder nicht, da dies bei bestimmten Funktionen zu merkwürdigem Verhalten führen kann.

    
Mat 17.12.2011, 12:24
quelle
3

Sie müssen eine MOC-Datei erstellen, die mit qmake erstellt wird, wenn Sie das Makro Q_OBJECT in Ihre Klasse einfügen.

Um Ihr Beispiel zu beheben, müssen Sie Ihre Klasse folgendermaßen ändern:

%Vor%     
BЈовић 17.12.2011 12:25
quelle