某位群友突然无征兆的抛出以下问题:
QGraphicsItem怎么写自定义信号啊
看到这个问题的时候我是比较疑惑的,按鄙人对 Qt 的了解,自定义信号只需:
- 继承QObject
- 类中加入Q_OBJECT宏
- 声明一个信号并使用
但该群友毕竟也不是一个Qt新手,按道理不会提出这么初级的问题,一时之间我竟不太敢回答…
幸好另一位热心群友回了句 “需要继承QObject” 启发了下我,发动我们技术群算命的经验,有如下猜测:
QGraphicsItem 一般在 Qt graphics-view 框架下用于被继承再实现自定义的 item,自定义 item 使用信号也是很常见的需求,这样就要同时继承 QGraphicsItem 和 QObject,而 Qt 的元对象编译器对 QObject 的多继承是有明确的规定的,没有首先继承QObject 也算是刚使用 graphics-view 框架的开发者常犯的错误之一。
果不其然,过了一会提出问题的群友自述问题已解决,正是QObject没有首先被继承所造成。
仍然是本着破除模棱两可的心态(更多是帮群友破除…),我们查阅Qt文档,找到了 Using the Meta-Object Compiler (moc) 这篇:
在目录链接中我们看到限制中有如下内容:
链接点击过去,内容如下:
文档中明确的规定了:多继承时要求QObject在首位;同时还指出,不支持虚继承QObject。
使用Qt的开发者都应当知道,Qt 拥有自己的元对象编译器(moc,Meta-Object Compiler),编译时会扫描包含 Q_OBJECT 宏的类,生成对应的 moc_xxx.cpp,其中包含了实现元对象系统的代码;而多继承时 moc 只会将首位继承的类认为是 QObject,如果首位继承的不是 QObject 及其子类,生成的源文件必然是会语法异常,因为其缺少了实现元对象系统的必要成员。