QT中信号的未定义引用问题

8

我想在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宏,但是没有解决。


这里有一个关于使用信号和槽所需的解释:http://stackoverflow.com/questions/22985894/qt-cant-connect-a-subclass-of-qgraphicsview-signal-not-inherited-to-slot/22986102#22986102 - TheDarkKnight
1
请注意,继承QThread不建议用于使用线程:http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ - TheDarkKnight
1
而且你也可以阅读这篇文章:http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html - Jablonski
添加 Q_OBJECT 宏后,必须在构建之前运行 qmake。 - Mohammad Reza Rastegari
3个回答

17

将Q_OBJECT宏添加到您的子类中,并运行qmake。

该宏允许您使用信号和槽机制。如果没有此宏,moc无法创建您的信号,因此您会收到错误消息,指出您的信号不存在。

代码应该是:

class ReadDPC: public QThread {
Q_OBJECT
请确认使用新的信号与槽语法时,您是否忘记添加此宏并且在编译时可能会出现错误。如果您对此感兴趣,请在此处阅读更多:http://qt-project.org/wiki/New_Signal_Slot_Syntax

1
@arc_lupus 尝试清理你的项目并重新构建它。 - Jablonski
清理了项目,重新构建,没有变化 :-(。我是不是忘记添加一些额外的头文件了? - arc_lupus
3
@arc_lupus 遇到了同样的问题:原帖中只运行了qmake。链接:http://stackoverflow.com/questions/25470635/qconnect-find-no-such-slot-on-qcombobox-by-qt-creater/25470865#25470865 - Jablonski
你是否在头文件上运行了 moc 并将生成的 .cpp 文件包含到你的项目中(编译/链接)? - Johannes S.
不,我只运行了qmake。 - arc_lupus

7
  1. 添加 Q_OBJECT
  2. 清除项目
  3. 运行 qmake
  4. 仅在此之后运行项目

4

当你要使用Qt信号和槽机制时,你必须在类定义的顶部添加Q_OBJECT宏,以便生成正确的moc_代码。

为什么这样做呢?

Meta-Object Compiler(moc)是处理Qt C++扩展的程序。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接