【Qt】Q_OBJECT宏,编译报错,解决办法(多继承Object情况下)

操作系统:win10
环境:Qt5.7.0 VisualStudio2015

公司新任务,将原本的MFC项目移植成Qt项目,界面什么的没什么太大难度,几天就完成了。
但是底层的关键API移植出现了问题。

某个类中,使用了PostMessage()函数来发送用户自定义消息,Qt的界面去接受实在是太复杂
就想着把所有的PostMessage换成Qt的信号来发送
于是乎,在该类头文件中加了#include<QObject>,再让该类继承QObject,加上Q_OBJECT宏来支持信号与槽

Class RVP : public RVPBuffer , public QObject
{
Q_OBJECT
public:
RVP()
~RVP()
....
....
....
}

然后就出现了坑爹的报错,最初是在QtCreator下编译:
QtCreator

RVP.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl CRVP::metaObject(void)const " (?metaObject@CRVP@@UEBAPEBUQMetaObject@@XZ)

RVP.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual void * __cdecl CRVP::qt_metacast(char const *)" (?qt_metacast@CRVP@@UEAAPEAXPEBD@Z)

RVP.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual int __cdecl CRVP::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@CRVP@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)

debug\VL.exe:-1: error: LNK1120: 3 个无法解析的外部命令

NMAKE:-1: error: U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.EXE"”: 返回代码“0x460”

NMAKE:-1: error: U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"”: 返回代码“0x2”

这错误很莫名其妙啊,尝试着把Q_OBJEC宏给删掉
然后编译通过了,但是这样就不能使用信号与槽机制
非我所欲也!
后来把.pro转换成了VS项目进行编译,结果还是出现了类似的问题

Visual Studio 2015

1>debug\moc_RVP.cpp(64): error C2039: “staticMetaObject”: 不是“CRVPBufferManager”的成员
1> h:\vl_workspace\qt\vl_space\vl\rvp\RVPBuffer.h(26): note: 参见“CRVPBufferManager”的声明
1>debug\moc_RVP.cpp(81): error C2039: “qt_metacast”: 不是“CRVPBufferManager”的成员
1> h:\vl_workspace\qt\vl_space\vl\rvp\RVPBuffer.h(26): note: 参见“CRVPBufferManager”的声明
1>debug\moc_RVP.cpp(86): error C2039: “qt_metacall”: 不是“CRVPBufferManager”的成员
1> h:\vl_workspace\qt\vl_space\vl\rvp\RVPBuffer.h(26): note: 参见“CRVPBufferManager”的声明

当时我就斯巴达了
各种找问题,结果还是臣妾做不到啊
折腾了一个下午,就当我准备放弃,改用复杂的重写事件函数来接收PostMessage的消息时
鄙人突然一阵头脑风暴
Class RVP : public RVPBuffer , public QObject
两个继承换了个顺序:
Class RVP: public QObject , public RVPBuffer

居然编译通过了
然编译通过了
编译通过了
译通过了
通过了
过了
...
这™也可以啊!!!

QObject还真是傲娇啊
继承还要写在第一个,不然Q_OBJECT就不干活了

猜你喜欢

转载自blog.csdn.net/shihoongbo/article/details/52853863