Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt";信号未定义参考错误“;从QObject继承后_C++_Qt_Qtcore_Qt Signals_Moc - Fatal编程技术网

C++ Qt";信号未定义参考错误“;从QObject继承后

C++ Qt";信号未定义参考错误“;从QObject继承后,c++,qt,qtcore,qt-signals,moc,C++,Qt,Qtcore,Qt Signals,Moc,我最近需要向类添加一个信号,所以我将该类更改为继承自QObject,并将Q_OBJECT宏添加到类定义中。执行此操作后,我在下面的类行中得到了“vtable for CLICommand”的“signal undefined reference error”(信号未定义参考错误)错误: // File clicommand.h #include <QString> #include <QStringList> #include <QTcpSocket> #in

我最近需要向类添加一个信号,所以我将该类更改为继承自QObject,并将Q_OBJECT宏添加到类定义中。执行此操作后,我在下面的类行中得到了“vtable for CLICommand”的“signal undefined reference error”(信号未定义参考错误)错误:

// 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.h
#包括
#包括
#包括
#包括“telnetthread.h”
class CLI命令:公共QObject
{
Q_对象
公众:
CLICommand(TelnetThread*parentTelnetThread);
信号:
无效信号关闭请求();
私人:
TelnetThread*m_parentTelnetThread;
以及第二个错误“为'vtable for CLICommand'发出未定义的参考错误信号”(初始化成员变量):

//文件clicommand.cpp
#包括
#包括
#包括
#包括“version.h”
#包括“clicommand.h”
#包括“telnetthread.h”
#包括“logger.h”
CLICommand::CLICommand(TelnetThread*parentTelnetThread)
:m_parentTelnetThread(parentTelnetThread)
{
}
这里就是我发出信号的地方。发出行生成错误未定义的对'CLICommand::signal\u shutdown\u 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();
}
//文件关闭\clicommand.cpp
#包括
#包括“clicommand.h”
#包括“logger.h”
#包括“version.h”
void CLICommand::执行_关闭(const QStringList和commandLineFragments)
{
发出信号_关闭_请求();
}
我已经读了很多关于这个主题的文章,但似乎没有一篇是适用的。我甚至尝试了clean/rebuildall。我没有使用boost或其他库…只是qt5

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



解决方案:在QT Creator中,右键单击项目,选择RUN QMAKE,然后重新生成所有。关于运行rebuild all的其他帖子不正确…它本身不会运行QMAKE。

您需要确保“moc”是(re)运行这些更改。您可能错过了生成的moc文件,或者该文件已过时,因此未包含对当前状态的正确引用

添加Q_对象宏时,QtCreator无法正确重新运行
qmake
。这是一个长期存在的问题,因此您需要手动重新运行它


当使用Qt Creator时,显式重新运行
qmake
的最简单方法可能是直接转到构建并删除
Makefile
。然后,在下一个“全部构建”操作中,Qt Creator重新生成它,这样
Q_对象
与更改相关的链接错误就会消失。
// 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();
}