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

相关文章

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

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

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

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

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