解决cpp添加QObject派生类的问题

一般我们继承QObject类在头文件中添加,但是有时候需要在源文件中添加。这样就会不可避免地出现编译错误。那么我们该究竟怎么解决它呢?

问题重现

  • 执行下列源码会报以下错误:

    1
    2
    error: undefined reference to `vtable for Object'
    错误: 未定义引用'Object'的虚函数表
  • 问题源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* main.cpp */
    #include <QCoreApplication>

    class Object : public QObject {
    Q_OBJECT
    public:
    Object() { }
    };

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    Object object;
    return a.exec();
    }

问题分析

  • 这是Qt的moc工具不识别cpp导致。
  • 由于moc工具不识别cpp文件中继承于QObject的类,这样就不能自动为该类添加一些实现函数(元对象函数),就会导致函数未定义的错误
  • 当qmake运行起来时,moc工具会自动识别处理头文件中所有继承于QObject的类和一系列Qt元对象属性。
  • 要想让moc识别cpp文件,只需要包含#include 当前文件.moc就可以了。

解决步骤(方法)

  1. 包含当前文件.moc到其类定义下或最后一行(注意:不能Object类先于定义);
  2. 清除项目->qmake->编译。
  • 修正源码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /* main.cpp */
    #include <QCoreApplication>

    class Object : public QObject {
    Q_OBJECT
    public:
    Object() { }
    };

    #include "main.moc"

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    Object object;
    return a.exec();
    }