Qt元编译器系统(一)

2024-08-27 04:18
文章标签 系统 qt 编译器

本文主要是介绍Qt元编译器系统(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt的元对象编译器(MOC)

  • 首先必须知道Qt的信号槽系统是通过元对象编译器moc(Meta-Object Compiler)实现的;
  • 听着很懵,但仔细回想一下,再开发工程中是不是都能看到一堆moc_XXXX.cpp的文件,这其实就是Qt元编译器产生的转义中间文件;
  • 在Qt工程中,如果类声明中包含Q_OBJECT宏定义,则会生成另外一个moc_XXXX.cpp的C++文件;
emit

跳转到emit的定义,会发现本身就是一个空的宏,也就说,发送信号本质上是执行了一个函数。在这里插入图片描述

Q_OBJECT
  • 跳转到Q_OBJECT的定义,有一个关键的静态成员变量staticMetaObject和私有方法qt_static_metacall;
  • 在这里插入图片描述
moc文件
QT_INIT_METAOBJECT const QMetaObject XXX::staticMetaObject = { {QMetaObject::SuperData::link<QWidget::staticMetaObject>(),qt_meta_stringdata_XXX.data,qt_meta_data_XXX,qt_static_metacall,nullptr,nullptr
} };

staticMetaObject 这是用来存类的信号、槽、属性等元信息,并且把qt_static_metacall作为函数指针存储起来。由于是静态元对象,所有该类的实例都会共享同一个,不要重复占用内存,减少了开销。

  • qt_static_metacall 用与执行有关的绑定的槽函数或者相关的信号转发

  • qt_meta_data_XXX 用于存储元对象信息,包括信号和槽机制、参数类型信息和一些动态属性在这里插入图片描述

  • qt_meta_stringdata_XXX.data就是存入了访问stringdata0子字符串的指针变量及长度
    在这里插入图片描述
    static const qt_meta_stringdata_XXXX_t qt_meta_stringdata_XXXX:用于存储函数列表及参数信息,内部通过将所有函数拼接成字符串,通过QT_MOC_LITERAL进行字符串的划分;

三个公有方法metaObject、qt_metacast、qt_metacall
  • metaObject 用于获取函数的元对象(基本上无需理解,元对象具体是什么,可以看一下QMetaObject的声明)
  • qt_metacast 可以在运行时根据字符串名,将当前对象转为相应的基类对象指针,如果转换不成功就是 nullptr
  • qt_metacall 这个是调用函数的回调,_c 是元调用方式(QMetaObject::Call ),_id 是属性的绝对序号(Qt对象树顶层QObject到当前方法的索引),_a 是对应需要的需要的参数指针
结论

至此,可能大概对Qt的元编译器有了一个大概了解,也大概明白了Qt信号槽的底层实现(函数回调,只是开发人员几乎无法感知),如果有看不懂的,一定要先了解Qt元对象(QMetaObject)的基础知识。

这篇关于Qt元编译器系统(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110604

相关文章

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停