QTimer::singleShot() recherche pour le logement indiqué dans le parent de l'objet de classe, et non l'objet lui-même
Je suis assez nouveau à l'intervalle Qt. J'ai fait quelques modifications simples à une application Qt, mais je n'ai pas créé tout à partir de zéro encore.
Je n'ai pas vraiment beaucoup d'expérience avec certains aspects du C++ en général (l'héritage de classe, etc).
J'ai créé un nouveau Code::Blocks Qt4-fondé du projet et modifié le modèle un peu. J'ai ajouté deux fichiers.
Actuellement, le projet contient trois fichiers: main.cpp, app.h et app.cpp.
Ceci est le contenu de main.cpp:
#include <QTimer>
#include "app.h"
int main(int argc, char* argv[]) {
TestApp app(argc, argv);
QTimer::singleShot(1000, &app, SLOT(timeout()));
return app.exec();
}
C'est ce que app.h ressemble:
#ifndef APP_H_INCLUDED
#define APP_H_INCLUDED
#include <QApplication>
class TestApp: public QApplication {
public:
TestApp(int &argc, char **argv);
public slots:
void timeout();
};
#endif
Et c'est app.cpp:
#include "app.h"
#include <QDebug>
TestApp::TestApp(int &argc, char **argv): QApplication(argc, argv) {
}
void TestApp::timeout() {
qDebug() << "timeout called";
}
J'attendais le programme d'impression de "temps mort" d'une seconde après le démarrage. Malheureusement, cela ne fonctionne pas. Lorsque QTimer::singleShot()
est appelée, la console dit:
Object::connect: No such slot QApplication::timeout() in [path to the main.cpp file]
Object::connect: (receiver name: 'QtTests')
Je n'ai aucune idée de comment faire face à cela. Je vous remercie à l'avance.
OriginalL'auteur rhino | 2011-12-17
Vous devez vous connecter pour publier un commentaire.
Vous êtes tout simplement disparu de la
Q_OBJECT
macro dans votre TestApp classe:Cela est nécessaire pour que la totalité du signal/slot de l'infrastructure (et dérivant d'une classe qui possède cette macro n'est pas suffisant).
(Assurez-vous de faire un plein, propre à créer après que le changement - et si vous n'utilisez pas
qmake
ou certains autres Qt-connaissance du système de construction, vous aurez besoin pour exécutermoc
vous-même.)Pour référence, voir le
QObject
docs:OriginalL'auteur Mat
Vous devez créer un fichier moc, qui est créé avec qmake si vous mettez de la macro q_object dans votre classe.
Donc, pour fixer votre exemple, vous avez besoin de votre classe changé :
Q_OBJECT
dans la déclaration de classe est insuffisant lorsque Qmake n'est pas appelée, par exemple lors de la construction avec CMake.Pour cela, vous devez utiliser
QT4_WRAP_CPP
, de sorte que le cmake permettrait d'analyser les en-têtes, et de générer de la moc fichiers.OriginalL'auteur BЈовић