尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Qt ---- 元对象系统
QObject 是所有支持元对象系统类的基类。1 QObject使用元对象系统需要满足两个条件1直接或间接继承 QObject2类声明开头包含 Q_OBJECT 宏QObject 与元对象系统相关的主要接口函数类型函数功能公有函数元对象QMetaObject *metaObject()返回元对象每个QObject及其子类实例都有一个元对象这个元对象是自动创建的。类型信息bool inherits()是否继承某个类动态翻译QString tr()返回字符串的翻译版本对象树QObjectList children()返回子对象列表QObject *parent()返回父对象指针void setParent()设置父对象T findChild()返回可转换为类型 T 的子对象QListT findChildren()返回符合名称和类型条件的子对象列表信号与槽QMetaObject::Connection connect()建立信号与槽的连接bool disconnect()断开信号与槽的连接bool blockSignals()阻止对象发射信号bool signalsBlocked()是否阻止对象发射信号属性系统QListQByteArray dynamicPropertyNames()返回动态属性列表bool setProperty()设置属性值或添加动态属性QVariant property()返回属性值静态公有函数QMetaObject staticMetaObject()类的元对象构建项目时 MOC 会读取 C源文件当它发现类的定义里有 Q_OBJECT 宏时它就会为这个类生成另一个包含元对象支持代码的 C源文件这个生成的源文件连同类的实现文件一起被标准 C编译器编译和连接。MOC元对象系统编译器2 信号与槽2.1 常见连接方式使用connect的静态函数建立信号与槽的连接1方法1Qt4语法使用宏SIGNAL()和SLOT()connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));2方法2Qt5语法使用函数指针// 一般形式 connect(lineEdit, QLineEdit::textChanged, this, Widget::do_textChanged); // Lambda表达式 connect(lineEdit, QLineEdit::textChanged, this, [](){/* doing */}); // 信号重载 connect(comboBox,static_castvoid(QComboBox::*)(int)(QComboBox::currentIndexChanged),this,[](int index){/* doing */});1. 一个信号可以连接多个槽2. 一个信号可以连接另一个信号3. 多个信号可以连接同一个槽4. 信号的参数大于等于槽的参数且参数类型应对应未连接成功1. 是否继承 QObject、是否包含宏 Q_OBJECT2. 建立连接时发射者和接收者是否均已实例化2. 信号参数是否与声明一致槽函数参数是否与信号对应2.2 断开连接的方式使用disconnect断开信号与槽的连接1解除与一个发射者所有信号的连接disconnect(myObject, nullptr, nullptr, nullptr); //静态函数形式 myObject-disconnect(); //成员函数形式2解除一个特定信号的所有连接disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr); //静态函数形式 myObject-disconnect(SIGNAL(mySignal())); //成员函数形式3解除与一个特定接收者的所有连接disconnect(myObject, nullptr, myReceiver, nullptr); //静态函数形式 myObject-disconnect(myReceiver); //成员函数形式4解除特定的一个信号与槽的连接函数指针disconnect(lineEdit, QLineEdit::textChanged, label, QLabel::setText); //静态函数形式个人很少见到程序中会主动断开信号与槽连接的2.3 获取信号发射者使用sender() 函数获取信号发射者void Widget::on_btnProperty_clicked() { QPushButton *btn qobject_castQPushButton*(sender()); //获取信号的发射者 bool isFlat btn-property(flat).toBool(); btn-setProperty(flat, !isFlat); }3 属性系统3.1 Q_PROPERTY使用宏 Q_PROPERTY 定义属性Q_PROPERTY(type name READ getFunction [WRITE setFunction] [MEMBER memberName] [RESET resetFunction] [NOTIFY notifySignal] [DESIGNABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])类型关键字功能定义type定义一个属性访问控制READ读取函数WRITE写入函数MEMBER绑定一个成员变量Qt 会自动生成读写逻辑信号与重置NOTIFY绑定一个信号属性值变化时发射信号RESET重置函数将属性重置为默认值UI设计DESIGNABLEQt Designer 的属性编辑器中是否可见默认 tureSTORED是否持久保存默认 true。若为false通常表示该属性值依赖于其他状态如QWidget::pos依赖于 geometryUSER用户是否可编辑默认 false。面向用户交互的属性一个类最多只有1个。如 QPushButton 的 checked 状态。关键字CONSTANT属性值是一个常数不能有 WRITE 和 NOTIFY 关键字。FINAL不能被子类重载示例Q_PROPERTY(bool focus READ hasFocus) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)1. 可读可写的属性读取函数名与属性名相同写入函数名一般是在属性名前面加“ set ”2. QObject 类提供了两个函数直接通过属性名字符串来访问属性函数 QObject::property()读取属性值函数 QObject::setProperty设置属性值3. 函数 QObject::setProperty()设置属性值时如果属性名称不存在就会为对象定义一个新的属性并设置属性值这时定义的属性称为动态属性。动态属性是针对类的实例定义的所以只能使用函数 QObject::property()读取动态属性的属性值3.2 Q_CLASSINFO使用宏 Q_CLASSINFO 定义类信息。class QMyClass : public QObject { Q_OBJECT Q_CLASSINFO(author, Wang) Q_CLASSINFO(company, UPC) Q_CLASSINFO(version , 3.0.1) };获取类信息的函数char *QMetaClassInfo::name() //返回类信息的名称 char *QMetaClassInfo::value() //返回类信息的值类信息程序中基本见不到很少用。附录1 QMetaObject每个 QObject 及其子类的实例都有一个自动创建的元对象元对象是 QMetaObject 类型的实例存储了类的实例所属类的各种元数据包括类信息元数据、方法元数据、属性元数据等。QMetaObject 的主要接口函数类型函数功能公有函数类信息char *className()返回类名称QMetaType metaType()返回元对象的元类型QMetaObject *superClass()返回上层父类的元对象bool inherits(QMetaObject *metaObject)是否继承 metaObject 描述的类QObject *newInstance()创建一个新实例类信息元数据QMetaClassInfo classInfo(int index)返回序号为 index 的一条类信息的元数据类信息是在类中用宏 Q_CLASSINFO 定义的一条信息int indexOfClassInfo(char *name)返回名称为 name 的类信息序号序号可用于 classInfoint classInfoCount()返回类信息个数int clasInfoOffset返回第一条类信息的序号构造函数元数据int constructorCount()返回构造函数个数QMetaMethod constructor(int index)返回序号为 index 的构造函数的元数据方法元数据int indexOfConstructor(char *constructor)返回构造函数的序号QMetaMethod method(int index)返回序号为 index 的方法的元数据int methodCount()返回方法的个数int methodOffset()返回第一个方法的序号int indexOfMethod(char *method)返回名称为 method 的方法的序号枚举类型元数据QMetaEnum enumerator(int index)返回序号为 index 的枚举的元数据int enumeratorCount()返回枚举类型的个数int enumeratorOffset()返回第一个枚举类型的序号int indexOfEnumerator(char *name)返回名称为 name 的枚举类型的序号属性元数据QMetaProperty property(int index)返回序号为 index 的属性的元数据int propertyCount()返回属性的个数int propertyOffset()返回第一个属性的序号int indexOfProperty(char *name)返回名称为 name 的属性的序号信号与槽int indexOfSignal(char *signal)返回名称为 signal 的信号的序号int indexOfSlot(char *slot)返回名称为 slot 的槽函数的序号静态公有函数bool checkConnectArgs()检查信号与槽函数的参数是否兼容voidconnectSlotByName(QObject *object)迭代搜索 object 的所有子对象将匹配的信号和槽连接起来void invokeMethod()运行 QObject 对象的某个方法QByteArray normalizedSignature(char *method)将方法 method 的名称和参数字符串正则化去除多余空格。函数返回的结果可用于 checkConnectArgs()、indexOfConstructor()等函数个人理解元对象在调试和打印时可能会使用但程序中真的很少见如知道枚举的个数、方法的个数或某个信号的序号好像并没有什么用。附录2 英文缩写缩写全称中文MOCMeta-Object Compiler元对象编译器RTTIrun time type information运行时类型信息
RELATED

相关推荐

yuzu模拟器Switch游戏优化清单:一条命令定位卡顿

yuzu模拟器Switch游戏优化清单:一条命令定位卡顿

yuzu模拟器Switch游戏优化清单:一条命令定位卡顿 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads Switch游戏在电脑上跑,卡顿、掉帧、闪退是常态。基于yuzu-downloads提供的7个构建&#xff…

📅 2026/10/28 10:00:55
从ReAct到Workflow:智能体架构演进与云原生实践

从ReAct到Workflow:智能体架构演进与云原生实践

1. 从ReAct到Workflow:智能体架构的演进之路三年前我第一次接触ReAct框架时,就被它"思考-行动-观察"的循环机制惊艳到了。这个由Google Research提出的范式,让语言模型首次具备了动态与环境交互的能力。但当我真正将其应用于客服机…

📅 2026/10/28 9:55:53
CSP-J/S初赛C语言备考指南:资料集使用与复习流程

CSP-J/S初赛C语言备考指南:资料集使用与复习流程

简介:这份PDF资料集面向备战NOIP CSP-J与CSP-S初赛第一轮的青少年选手及编程入门学习者,系统梳理了初赛所需的核心知识框架。内容覆盖计算机概述与系统结构、软件系统与计算机语言、进制转换、信息编码与原反补码、网络常识、程序基础、排序算法以及字符…

📅 2026/10/28 9:55:53
MORE NEWS

更多资讯

📰

连接追踪技术原理与性能优化实践

1. 连接追踪技术概述连接追踪(Connection Tracking)是现代网络系统中实现状态感知的核心机制。不同于传统的无状态数据包处理,连接追踪通过维护连接状态表,使系统能够识别和处理属于同一通信会话的数据包序列。这项技术广泛应用于…

📰

连接追踪技术解析:原理、优化与实战案例

1. 连接追踪技术概述连接追踪(Connection Tracking)是现代网络系统中实现状态感知的核心机制。简单来说,它就像网络通信的"记忆系统",能够识别、记录和管理网络连接的状态变化。这项技术最早出现在防火墙系统中&#xf…

📰

AI工程师转型大模型:技术栈迁移与实战指南

1. AI程序员转型大模型的底层逻辑作为经历过完整技术转型周期的从业者,我深刻理解AI工程师面对大模型浪潮时的焦虑与机遇。2023年大模型技术栈的爆发式增长,让传统AI工程师的技能图谱面临重构。但有趣的是,经过半年实战验证,我发现…

📰

大数据预测模型性能评估:挑战与实践

1. 大数据预测分析模型性能评估的核心挑战在大数据时代,预测分析模型已成为企业决策的重要支撑工具。但面对TB级甚至PB级的数据量、复杂的业务场景和瞬息万变的市场环境,如何准确评估模型性能成为数据科学家面临的首要难题。传统的小规模数据集评估方法在…

📰

Cordys CRM Skills技能套件:智能化客户关系管理新突破

1. Cordys CRM Skills技能发布概述今天要跟大家分享一个企业服务领域的重磅更新——Cordys CRM Skills技能套件正式发布。作为在CRM领域深耕多年的从业者,我第一时间拿到了这套工具的测试权限,经过两周的深度体验,可以负责任地说:…

📰

impeccable:AI编码代理的前端设计质量增强层实战指南

1. 项目缘起与核心定位1.1 一个被名字耽误的实用工具第一次看到 "impeccable" 这个词,很多人会愣一下——这到底是个什么项目?名字取得太文艺了,不像常规技术工具那种直白的命名风格。但恰恰是这个略带"端着"的名字&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬