恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】

  • 首页
  • 资讯中心
  • /
  • Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】

相关资讯

基于Python+Hadoop+Spark的新闻推荐系统与热点分析实战 2026/10/20 22:17:21
MIMO非线性系统控制:预设性能+无模型自适应+分数阶快速终端滑模仿真实践 2026/10/20 22:12:21
达梦数据库从安装到运维的避坑指南:初始化、迁移与并发调优要点 2026/10/20 22:12:21

最新资讯

WinForms DataGridViewComboBox输入自动匹配实战指南
HyperDbg内核调试器:Ring0实时调试与EPT内存监控实战指南
学生信息管理系统:SSM架构下的数据一致性与工程落地实践
WinForm登录状态机设计:事件解耦与DPAPI安全存储实战
Quartz动态设置并发数量
纯Java数据包处理实战:抓包解析过滤统计全链路

今日推荐

SAP 屏幕上的金额未必存在数据库表里,从 WB2R_SV 的 Net Amount 看懂运行时计算
具身智能中‘指哪打哪’的视觉语言动作联合建模
AI时代人工翻译技术博客的价值与实践指南

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】

发布时间:2026/10/20 22:17:21
Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】 C 原生本身只有类、继承、成员、虚函数QObject 对象模型是 Qt 在标准 C 语法之上额外实现的一套扩展机制依托QObject基类 moc元对象编译器给 C 类增加原生 C 做不到的能力信号槽、运行时类型识别、动态属性、元信息、对象树内存管理。你那句话Qt 类本质就是 C 类只是 Qt 扩展了 QObject 对象模型含义THints、THintsMenu、THintsDialog这些类底层仍然是标准 C 的 class能使用 C 所有语法构造函数、继承、引用、指针、初始化列表只要继承 QObject就接入 Qt 这套额外的对象模型获得原生 C 没有的特性不继承 QObject 的普通 C 类就没有这套能力。一、标准原生 C 类缺了什么原生 C编译完成后类的信息全部被编译器砍掉。运行时程序不知道类叫什么名字、有哪些成员函数、有哪些属性没有内置 “回调绑定机制”想做事件回调只能手动写函数指针没有动态属性一个类定义完成员就固定运行时不能临时新增属性内存管理需要自己手动new/delete没有自动父子托管多继承有虚继承、菱形继承的麻烦。原生 C 的信息只在编译期存在编译完二进制里面几乎不保留类的描述信息。二、QObject 对象模型由哪几部分组成1. 基类QObject所有想使用这套模型的类必须直接 / 间接继承 QObject就像你代码里THintsMenu : public QObject, public QDesignerTaskMenuExtensionTHintsDialog : public QDialog而QDialog继承QWidgetQWidget继承QObject继承 QObject 是入场券。2. 元对象宏Q_OBJECT核心class THintsMenu : public QObject { Q_OBJECT // 关键宏 ... };只要写Q_OBJECT编译前 Qt 的mocMeta Object Compiler元对象编译器会扫描你的头文件自动生成额外 C 代码moc_thintsmenu.cpp。moc 不是 C 标准编译器是 Qt 单独的预处理器。 moc 会提取这个类的信息类名、信号、槽、属性生成一个元对象类 QMetaObject。3. QMetaObject元对象保存类的描述信息moc 生成的QMetaObject相当于这个类的 “运行时说明书”里面存类名字符串所有信号列表、槽函数列表属性列表property方法信息原生 C 运行时没有这份说明书QObject 模型把这份说明书打包进程序运行时可以读取。三、QObject 对象模型提供的五大核心能力结合你刚才看的源码举例① 信号与槽Signal Slot—— 最常用原生 C 要用函数指针手动绑定回调非常麻烦 Qt 信号槽由元对象系统实现connect可以把一个对象的信号连接到另一个对象的槽函数。connect(edit_state_action_, QAction::triggered, this, THintsMenu::edit_state);原理 运行时通过QMetaObject找到信号、槽的信息信号触发时元对象系统自动找到所有连接的槽函数调用。信号槽支持跨线程这是普通 C 函数指针很难安全实现的。② 运行时类型识别 qobject_cast你代码里出现过THints *hints qobject_castTHints *(object);原生 C 有dynamic_cast但依赖 RTTI有开销、限制多qobject_cast是 Qt 元对象系统实现的类型转换不需要 C 的 RTTI 开关只对继承 QObject 的类生效。 运行时读取QMetaObject的类名信息判断对象是不是目标类型失败返回 nullptr。 你工厂类THintsMenuFactory::createExtension就是靠这个判断选中的控件是不是 THints。③ 动态属性系统 setProperty /property你 on_finished 里面用到form_window-cursor()-setProperty(tips_type_, thints_.property(tips_type_));原生 C类定义写死成员变量运行不能临时增加变量。 QObject 对象模型 可以在运行时给 QObject 派生对象动态附加键值对属性不需要在 class 里预先定义成员。 Qt 设计师保存控件属性到 ui 文件底层就是这套动态 property。④ 对象树Object Tree内存自动管理Qt 内存管理核心QObject 派生类构造可以传入parent父对象指针THintsMenu::THintsMenu(THints *control, QObject *parent) : QObject(parent)规则子对象加入父对象的对象树父对象析构的时候会自动 delete 所有子 QObject 对象不用你一个个手动 delete 子控件避免内存泄漏。注意普通 C 对象没有这个父子托管只有 QObject 子类才有对象树。 你代码里new QAction(tr(设置THints...), this)this作为父对象THintsMenu 销毁时自动释放这个 QAction。区分ui指针是普通堆对象不属于 QObject 对象树所以你必须在析构写delete ui;QAction、THintsMenu、THintsDialog 属于 QObject走对象树。⑤ 元属性、反射支持 Qt Designer 属性面板Qt 设计师可以在右侧属性面板直接修改控件参数原理就是QMetaObject 反射 Qt 设计器运行时读取控件的元对象信息自动识别属性展示到属性面板修改后用 setProperty 写回去。 你写的 THints 自定义控件能在 Qt 设计师拖拽、编辑属性完全依赖这套对象模型。四、关键限制QObject 模型的代价必须继承 QObject并且写 Q_OBJECT 宏moc 才会处理多重继承时QObject 必须放在第一个继承位置不能模板类直接使用 Q_OBJECTmoc 是预编译步骤忘记 qmake/CMake 开启 moc 就编译报错。五、一句话对比普通 C 类编译完类信息丢弃只有代码逻辑内存、回调、类型判断全部自己写。继承 QObject 的 Qt 类依然是 C 类但是 moc 额外生成元对象代码在运行时携带类的描述信息以此实现信号槽、动态属性、对象树、qobject_cast这套整体就叫QObject 对象模型。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号