Qt undefined引用`vtable for Messenger'

时间:2013-11-02 13:38:27

标签: c++ qt vtable

我收到此错误

/.../mainwindow.o:-1: In function `MainWindow::MainWindow(QWidget*)':
/.../mainwindow.cpp:-1: Chyba:undefined reference to `vtable for Msnger'

我不明白为什么。只有我发现导致此消息的问题是没有定义的声明,我没有看到我的代码中的任何一个。

这里是Msnger班 msnger.h:

#include <QObject>

class Msnger : public QObject
{
    Q_OBJECT

public:
    Msnger() {};
    ~Msnger() {};
    void sendOn();
signals:
    void ton() {};
};

msnger.cpp:

#include "msnger.h"

void Msnger::sendOn()
{
    emit ton();
}

Msnger应该向我的Mainwindow发送消息

在mainWindow的构造函数中:

msn = new Msnger();
connect(msn, SIGNAL(ton()),this, SLOT(on()));

其中msn是:

public: Msnger * msn

你能解释一下造成这种情况的原因以及如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

您的问题是moc没有在您的文件上运行,或者其结果未被链接。

黄金法则是:

  1. 确保所有Q_OBJECT派生类的定义中都存在QObject宏。
  2. 请务必在头文件 中声明QObject - 派生类。
  3. 确保所有头文件都列在HEADERS=列表的.pro文件中。
  4. 每次将qmake添加到其中一个班级或修改Q_OBJECT文件时,请运行.pro

  5. 附录:

    signals:
        void ton() {};
    

    不要实施信号。 moc会为您实施。

答案 1 :(得分:1)

不确定您的编译器。

确保Qt Meta compiler正在为定义了Msnger类的头文件运行。生成的moc_ * cpp文件是用您的编译器编译的。

PS。当QObject继承类名称以'Q'开头时,这是很好的,例如QMsnger