Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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中信号的未定义参考_C++_Multithreading_Qt - Fatal编程技术网

C++ QT中信号的未定义参考

C++ QT中信号的未定义参考,c++,multithreading,qt,C++,Multithreading,Qt,我想在Qt中的一个单独文件中创建一个类,然后在我的主文件中使用这个类(背景:次要线程更新GUI)。因此,我编写了ReadDPC.h-文件: class ReadDPC: public QThread { //First edit: Q_OBJECT //End of first edit public: void run(); signals: void currentCount(int); }; 在我的ReadDPC.cpp-文件中: void ReadDPC::run()

我想在Qt中的一个单独文件中创建一个类,然后在我的主文件中使用这个类(背景:次要线程更新GUI)。因此,我编写了
ReadDPC.h
-文件:

class ReadDPC: public QThread
{
//First edit:
Q_OBJECT
//End of first edit
public:
    void run();
signals:
    void currentCount(int);
};
在我的
ReadDPC.cpp
-文件中:

void ReadDPC::run()
{
    while(1)
    {
        usleep(50);
        int counts = read_DPC();
        emit currentCount(counts);
    }
}
read\u DPC()
是一个返回
int
-值的函数,该值也位于cpp文件中。
但是当我想编译它时,我得到了错误
对ReadDPC::currentCount(int)
的未定义引用。为什么?我怎样才能解决这个问题


编辑:添加了
Q\u对象
-宏,没有解决方案。

将Q\u对象宏添加到子类并运行qmake

此宏允许您使用信号和插槽机制。没有这个宏,moc无法创建您的信号,所以您会得到错误,您的信号不存在

代码应为:

class ReadDPC: public QThread {
Q_OBJECT

请注意,当您使用新的信号和插槽语法时,可能会出现编译时错误,您忘记了添加此宏。如果您感兴趣,请在此处阅读更多内容:

当您打算使用Qt信号和插槽机制时,您必须在类的定义顶部添加
Q_对象
宏,以便生成正确的
moc
代码

为什么会这样?

元对象编译器MOC是处理Qt C++的程序。 扩展

MOC工具读取C++头文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生C++源 包含这些类的元对象代码的文件。除其他外 因此,信号和插槽需要元对象代码 机制、运行时类型信息和动态属性 系统

  • 添加Q_对象
  • 清除您的项目
  • 运行qmake
  • 只有在那之后,运行你的项目

  • @arc_lube尝试清理并重建项目。清理项目,重建项目,无更改:-(.我忘记添加一些附加头文件了吗?@arc_lube相同问题:op刚刚运行qmake:是否在头上运行
    moc
    ,并将生成的
    .cpp
    文件包含在项目中(编译/链接)?不,我只运行了qmake。这里有一个关于使用信号和插槽所需的说明:还请注意,不建议使用线程继承QThread:另外,您可以阅读本文:添加Q_对象宏后,必须在生成之前运行qmake