2013-10-04 3 views
7

J'ai récemment besoin d'ajouter un signal à une classe, j'ai donc changé la classe pour hériter de QObject et ajouté la macro Q_OBJECT dans la définition de classe. Depuis ce faisant, je reçois « signal d'erreur de référence non définie pour « vtable pour CLICommand » » erreur sur la ligne de classe ci-dessous:Qt "signal erreur de référence indéfinie" après avoir hérité de QObject

// File clicommand.h 
#include <QString> 
#include <QStringList> 
#include <QTcpSocket> 
#include "telnetthread.h" 
class CLICommand : public QObject 
{ 
Q_OBJECT 
public: 
    CLICommand(TelnetThread *parentTelnetThread); 
signals: 
    void signal_shutdown_request(); 
private: 
    TelnetThread *m_parentTelnetThread; 

et la seconde erreur « erreur de référence non définie du signal pour « vtable pour CLICommand » » sur la ligne ci-dessous (la variable initialisation de membre):

// File clicommand.cpp 
#include <QDebug> 
#include <QTcpSocket> 
#include <QTextStream> 
#include "version.h" 
#include "clicommand.h" 
#include "telnetthread.h" 
#include "logger.h" 
CLICommand::CLICommand(TelnetThread *parentTelnetThread) 
    : m_parentTelnetThread(parentTelnetThread) 
{ 
} 

et juste ici est où j'émets le signal. La ligne emit génère l'erreur undefined reference to `CLICommand :: signal_shutdown_request() »:

// file shutdown_clicommand.cpp 
#include <QIODevice> 
#include "clicommand.h" 
#include "logger.h" 
#include "version.h" 
void CLICommand::execute_shutdown(const QStringList &commandLineFragments) 
{ 
    emit signal_shutdown_request(); 
} 

J'ai lu un tas de messages sur ce sujet, mais aucun ne semble appliquer. J'ai même essayé propre/rebuildall. Je n'utilise pas boost ou d'autres bibliothèques ... juste QT 5

Quelqu'un peut-il me dire ce que je fais mal? SOLUTION: dans QT Creator, faites un clic droit sur le projet, sélectionnez RUN QMAKE, puis reconstruisez tout. Les autres articles sur l'exécution de REBUILD ALL sont incorrects ... en tant que tels, ils ne liront pas qmake.

Répondre

12

Vous devez vous assurer que 'moc' est (re) exécuté pour ces changements. Il semble que vous manquiez le fichier moc généré ou qu'il soit périmé et ne contienne donc pas la référence appropriée à l'état actuel.

QtCreator ne réexécute pas correctement qmake lorsque la macro Q_OBJECT est ajoutée. Cela a été un problème de longue date, vous devrez donc le relancer manuellement.

https://bugreports.qt.io/browse/QTCREATORBUG-231

+0

toujours avec une réponse simple et bonne, merci +1 –

+0

Peut-être la meilleure façon de ré-exécuter explicitement 'qmake' lors de l'utilisation de Qt Creator est d'aller à la construction directement et retirez' Makefile'. Ensuite, lors de la prochaine action 'Build all', Qt Creator le régénère, de sorte que l'erreur de lien liée à la modification de 'Q_OBJECT' disparaisse. – maxschlepzig

Questions connexes