QT中信号的未定义参考

时间:2014-10-15 14:04:51

标签: 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()
{
    while(1)
    {
        usleep(50);
        int counts = read_DPC();
        emit currentCount(counts);
    }
}

read_DPC()是一个返回int的函数 - 也放在cpp文件中的值。
但是当我想编译它时,我收到错误undefined reference to ReadDPC::currentCount(int)。为什么?我该如何解决这个问题?

修改:添加了Q_Object - 宏,没有解决方案。

3 个答案:

答案 0 :(得分:10)

将Q_OBJECT宏添加到子类并运行qmake。

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

代码应该是:

class ReadDPC: public QThread {
Q_OBJECT

请注意,当您使用新信号和插槽语法时,您可能会遇到编译时错误,您忘记添加此宏。如果您感兴趣,请在此处阅读更多内容:http://qt-project.org/wiki/New_Signal_Slot_Syntax

答案 1 :(得分:2)

当您打算使用Qt信号时插槽机制您必须在类的定义顶部添加Q_OBJECT宏,才能生成正确的moc_代码。

为什么会这样?

  

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

     

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

http://qt-project.org/doc/qt-4.8/moc.html#moc

答案 2 :(得分:1)

  1. 添加Q_OBJECT
  2. 清除您的项目
  3. 运行qmake
  4. 只有在那之后,运行你的项目