【问题标题】:Undefined reference to signal in QTQT中对信号的未定义引用
【发布时间】:2014-10-15 14:04:50
【问题描述】:

我想在 Qt 的单独文件中创建一个类,然后在我的主文件中使用这个类(背景:辅助线程更新 GUI)。于是我写了ReadDPC.h-file:

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-Macro,没有解决方案。

【问题讨论】:

标签: c++ multithreading qt


【解决方案1】:

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

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

代码应该是:

class ReadDPC: public QThread {
Q_OBJECT

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

【讨论】:

  • @arc_lupus 尝试清理您的项目并重建它。
  • 清理了项目,重建它,没有任何变化:-(。我忘了添加一些额外的头文件吗?
  • @arc_lupus 同样的问题:op 只运行 qmake:stackoverflow.com/questions/25470635/…
  • 您是否在标头上运行了moc 并将生成的.cpp 文件包含在您的项目中(编译/链接)?
  • 不,我只运行了 qmake。
【解决方案2】:
  1. 添加 Q_OBJECT
  2. 清除您的项目
  3. 运行 qmake
  4. 只有在那之后,运行你的项目

【讨论】:

    【解决方案3】:

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

    为什么会这样?

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 2011-08-16
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多