Qt 未定义对 'vtable for Msnger' 的引用

Qt undefined reference to `vtable for Msnger'

本文关键字:Msnger 引用 for vtable 未定义 Qt      更新时间:2023-10-16

我收到此错误

/.../mainwindow.o:-1: In function `MainWindow::MainWindow(QWidget*)':
/.../mainwindow.cpp:-1: Chyba:undefined reference to `vtable for 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应该向我的主窗口发送消息

在主窗口的构造函数中:

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

其中 MSN 是:

public: Msnger * msn

你能向我解释一下是什么原因造成的,我该如何解决吗?

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

黄金法则是:

  1. 确保Q_OBJECT宏存在于所有QObject派生类的定义中。
  2. 确保仅在头文件中声明QObject派生类。
  3. 确保所有头文件都列在 .pro 文件的HEADERS=列表中。
  4. 每次向某个类添加Q_OBJECT或修改.pro文件时运行qmake

补遗:

signals:
    void ton() {};

不要实现信号。 moc将为您实施它。

不确定您的编译器。

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

附言。当 QObject 继承的类名以"Q"开头时,这很好,例如 QMsnger