当前位置: 首页 > article >正文

《我在技术交流群算命》(二):QGraphicsItem怎么写自定义信号啊(QObject多继承顺序问题)

某位群友突然无征兆的抛出以下问题:

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 及其子类,生成的源文件必然是会语法异常,因为其缺少了实现元对象系统的必要成员。

不得不感慨,群友是真的能混淆视听,问题的描述居然能和问题毫不相干。


http://www.kler.cn/a/464101.html

相关文章:

  • 基于单片机的家庭智能垃圾桶(论文+源码)
  • 把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用
  • 智联视频超融合平台:电力行业的智能守护者
  • NLP 复习大纲
  • 嵌入式学习(21)-正点原子脱机下载器Mini-Pro的使用
  • 代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
  • 深入解析 JVM vs JDK vs JRE:三者区别与联系详解
  • python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
  • LevelDB 源码阅读:利用 Clang 的静态线程安全分析
  • 彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程
  • 概率论与数理统计
  • 需求上线,为什么要刷缓存?
  • LeetCode算法题——长度最小的子数组
  • 大模型的prompt的应用一
  • 数据挖掘——集成学习
  • Java-写一个计数器
  • mac下载Homebrew安装nvm
  • 微服务间通信的端口开放性探究:从单机到多机的转变
  • <<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>
  • 第11章 汇编语言--- 内存模型概述
  • 文件本地和OSS上传
  • 虚拟机中的时统卡功能和性能调优
  • AI 驱动研发模式升级,蓝凌软件探索效率提升之道
  • 699: Arbitrage
  • 小组作业协同介绍
  • 代码随想录算法训练营第51期第32天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯