前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决cpp添加QObject派生类的问题

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

作者头像
Qt君
发布2019-07-15 16:31:59
1.7K0
发布2019-07-15 16:31:59
举报
文章被收录于专栏:跟Qt君学编程

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

问题重现

  • 执行下列源码会报以下错误:
代码语言:javascript
复制
error: undefined reference to `vtable for Object'
错误: 未定义引用'Object'的虚函数表
  • 问题源码:
代码语言:javascript
复制
/* 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->编译。
  • 修正源码:
代码语言:javascript
复制
/* 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();
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题重现
  • 问题分析
  • 解决步骤(方法)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档