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

相关文章

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.