2013-10-04 74 views
7

我最近需要添加一个信号到一个类,所以我改变了类从QObject继承,并将Q_OBJECT宏添加到类定义中。因为这样做,我得到“信号未定义的引用错误‘虚函数表的CLICommand’”下面的班线错误:Qt“信号未定义的参考错误”从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; 

和第二误差“信号未定义的引用为‘虚函数表的CLICommand’错误”下面的线(intializing成员变量):

// 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) 
{ 
} 

,只是这里是我发射该信号。了,emit行生成错误未定义的参考`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(); 
} 

我读了一堆关于这个主题的帖子,但似乎都不适用。我什至试图干净/ rebuildall。我不使用升压或其他库...只是QT 5

有人能告诉我我做错了什么吗?


解决方案:在QT Creator中,右键单击项目,选择RUN QMAKE,然后重新生成所有。关于运行重建ALL的其他帖子是不正确的......在它自己不会运行qmake。

回答

12

您需要确保'moc'正在(重新)执行这些更改。看起来你要么错过了生成的moc文件,要么是过时的,因此不包含对当前状态的适当引用。

当添加Q_OBJECT宏时,QtCreator不会正确重新运行qmake。这是一个长期存在的问题,所以您需要手动重新运行它。

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

良好和简单的答案
+0

往常,感谢+1 –

+0

也许使用Qt Creator的时候明确地重新运行'qmake'最简单的方法就是直接去构建和删除'Makefile'。然后,在下一个“全部构建”动作中,Qt Creator重新生成它,这样“Q_OBJECT”变化相关的链接错误消失。 – maxschlepzig