qt属性系统简介( Q_PROPERTY)

news/2024/4/24 20:16:29/

1、属性定义

    Qt 提供一个 Q_PROPERTY()宏可以定义属性,它也是基于元对象系统实现的。Qt 的属性系统与C++编译器无关,可以用任何标准的 C++编译器编译定义了属性的 Qt C++程序。

在QObiect 的子类中,用宏Q_PROPERTY()定义属性,其使用格式如下:

Q_PROPERTY(type name(READ getFunction [WRITE setFunction] |MEMBER memberName [(READ getFunction | WRITE setFunction)])[RESET resetFunction][NOTIFY notifysignal][REVISION int][DESIGNABLE boo1][SCRIPTABLE bool][STORED boo1][USER boo1][CONSTANT][FINAL] )

Q_PROPERTY宏定义一个返回值类型为 type,名称为 name 的属性,用 READ、WRITE 关键字定义属性的读取、写入函数,还有其他的一些关键字定义属性的一些操作特性。属性的类型可以是 QVariant 支持的任何类型,也可以用户自定义类型。

Q_PROPERTY 宏定义属性的一些主要关键字的意义如下:
1)READ 指定一个读取属性值的函数,没有 MEMBER 关键字时必须设置 READ。

2)WRITE 指定一个设定属性值的函数,只读属性没有 WRITE 设置。

3)MEMBER 指定一个成员变量与属性关联,成为可读可写的属性,无需再设置 READ 和WRITE

4)RESET 是可选的,用于指定一个设置属性缺省值的函数。

5)NOTIFY 是可选的,用于设置一个信号,当属性值变化时发射此信号。

6)DESIGNABLE 表示属性是否在 Qt Designer 里可见,缺省为 true。

7)CONSTANT 表示属性值是一个常数,对于一个对象实例,READ 指定的函数返回值是常数,但是每个实例的返回值可以不一样。具有 CONSTANT 关键字的属性不能有 WRITE和 NOTIFY关键字。

8)FINAL 表示所定义的属性不能被子类重载。

QWidget 类定义属性的一些例子如下:

O_PROPERTY(bool focus READ hasFocus)
O_PROPERTY(bool enabled READ isEnabled WRITE  setEnabled)
Q_PROPERTY(OCursor cursor READ cursor WRITE setCursor RESET unsetCursor)


2.属性的使用

不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过QObject:property()读取属性值,并通过 QObject::setProperty0设置属性值。例如:

QPushButton *button = new QPushButton;
QObject *object = button;
object->setProperty("flat", true);
boo1 isFlat= object->property("flat");

3.动态属性

QObject::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。

动态属性可以使用QObject:property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。

例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required 属性,并设置值为“true”,如:

editName->setProperty("required","true");
comboSex->setProperty("required",“true");
checkAgree->setProperty("required","true");

然后,可以应用下面的样式定义将这种必填字段的背景颜色设置为亮绿色。

*[required="true"] (background-color: lime]

4.类的附加信息

属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义“名称--值”信息,如:

class QMyClass : public QObject
{
Q_OBJECT
Q_CLASSINFO("author""Wang")
Q_CLASSINFO("company","UPC")
Q_CLASSINFO("version","3.0.1")
public:
...
}

用Q_CLASSINFO()宏定义附加类信息后,可以通过元对象的一些函数获取类的附加信息,如classInfo(int)获取某个附加信息,函数原型定义如下:
OMetaClassInfo OMetaObject::classInfo(int index) const

返回值是QMetaClassInfo 类型,有 name()和 value()两个函数可获得类附加信息的名称和值.


http://www.ppmy.cn/news/48185.html

相关文章

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件,设置优先级并开启 2、基于Scrapy框…

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

[线上故障][坑] spring的自动装配和事务不生效

哪些年的故障 spring自动装备 方案1 <context:annotation-config scan/ > autowired byType Qulified Resource byName 不建议, 二选一, 自动选择同名的. Autowired与Resource异同&#xff1a; 1、Autowired与Resource都可以用来装配bean。都可以写在字段上&#x…

CAS操作实际上包含了哪两个步骤?

目录 先讲原理&#xff1a; 再深入CAS规则&#xff1a; 问题&#xff1a;第一步是否应该是修改预期值&#xff1f; 总结一下&#xff1a; 先讲原理&#xff1a; CAS的全称是Compare And Swap&#xff08;比较并交换&#xff09;&#xff0c;是一种原子操作&#xff0c;通常…

zookeeper 单机环境搭建(三)

下载地址&#xff1a;Index of /dist/zookeeper 1.新建目录/home/yy/tools/zookeeper&#xff0c;将下载好的apache-zookeeper-3.8.0-bin.tar拷进/home/yy/tools目录。 2.解压zk tar –zxvf apache-zookeeper-3.8.0-bin.tar j3. cd到解压后的zk路径下&#xff0c; 将解压后…

二叉树的遍历

文章目录 二叉树的遍历方式先序遍历中序遍历后序遍历层序遍历 根据遍历过程构造二叉树已知前序(后序)中序输出后序(前序) 二叉树的遍历方式 先序遍历 先序遍历指遍历顺序为根节点——》左节点——》右节点 代码实现&#xff1a; //存储遍历结果的数组vector<int> v;//前…

9、MachO简介

一、MachO文件 MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似于windows上的PE格式(Portable Executable), linux上的elf格式(Executable and Linking Format) 二、MachO文件结构 Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件、目…

事件处理框架

一、事件处理框架-event_base Reactor模式有几个基础的组件&#xff0c;其中的Reactor框架就是event_base结构体&#xff0c;下面是定义&#xff08;只列出部分常用的成员&#xff09;&#xff0c;如下&#xff1a; struct event_base {/* 后台使用的I/O多路复用机制 */const s…

分享一些提升效率的小工具

1、 IObit Uninstaller IObit Uninstaller是一款简单专业的卸载工具&#xff0c;可以帮我们卸载电脑中顽固难卸的软件和浏览器插件&#xff0c;支持强制一键卸载和文件粉碎功能。 除了卸载软件&#xff0c;它还可以自动帮我们检测软件安装、检测软件更新、查看工具栏和插件。 …

K8S使用持久化卷存储到NFS(NAS盘)

参考文章&#xff1a;K8S-v1.20中使用PVC持久卷 - 知乎 目录 1、概念&#xff1a; 1.1 基础概念 1.2 PV的配置 1.2.1 静态PV配置 1.2.2 动态PV配置 1.2.3 PVC与PV的绑定 1.2.4 PVC及PV的使用 2 部署PV及PVC 2.1 所有K8S机器都需要安装NFS程序 2.2 仅针对需要暴露文件…

yara规则--编写

编写 YARA 规则 — yara 4.2.0 文档 YARA规则易于编写和理解&#xff0c;并且它们的语法是 类似于 C 语言。这是您可以编写的最简单的规则 YARA&#xff0c;它什么都不做&#xff1a; rule dummy {condition:false } 一、规则标识符 每个规则都以关键字“ rule”开头&#xff0…

如何处理嵌入式中程序错误

一、错误概念 1.1 错误分类 从严重性而言&#xff0c;程序错误可分为致命性和非致命性两类。对于致命性错误&#xff0c;无法执行恢复动作&#xff0c;最多只能在用户屏幕上打印出错消息或将其写入日志文件&#xff0c;然后终止程序&#xff1b;而对于非致命性错误&#xff0…

近期遇到的vscode 插件开发的问题,when表达式,正则匹配路径

前言 最近在修改dbt插件的时候&#xff0c;遇到了几个比较奇怪的问题&#xff0c;猜测应该是因为跟新了VSCode导致的。 这里稍微记录一下&#xff0c;如果能帮助其他的同学&#xff0c;那就太值啦。 when 正则表达式 之前有在packgae.json 中使用 when 的正则表达式&#xf…

flask-restful 和 blueprint

flask-restful 使用 flask-restful第三方库 from flask_restful import Resource, Api app Flask(__name__) api Api(app) class HelloWorldResource(Resource): def get(self): return {hello:world} def post(self): return {msg&#xff1a;‘post hello wolrd’} api…

非关系型数据库---Redis安装与基本使用

一、数据库类型 关系数据库管理系统(RDBMS)非关系数据库管理系统(NoSQL) 按照预先设置的组织机构&#xff0c;将数据存储在物理介质上(即&#xff1a;硬盘上) 数据之间可以做无关联操作 (例如: 多表查询&#xff0c;嵌套查询&#xff0c;外键等) 主流的RDBMS软件&#xff1a;My…

查询练习:查询所有学生的 s_no 、c_no 和 grade 列。

思路是&#xff0c;使用区间 ( BETWEEN ) 查询&#xff0c;判断学生的成绩 ( degree ) 在 grade 表的 low 和 upp 之间。 SELECT s_no, c_no, grade FROM score, grade WHERE degree BETWEEN low AND upp; -------------------- | s_no | c_no | grade | ------------------…

FPGA基于SFP光口实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下&#xff1a; 1&#xff1a;verilog编写的udp收发器&#xff0c;但不带ping功能&#xff0c;这样的代…

Ruby语言发展史(个人理解)

Ruby是一种动态、面向对象、通用的编程语言&#xff0c;它由松本行弘&#xff08;Yukihiro Matsumoto&#xff09;创造&#xff0c;最初于1995年发布。Ruby的设计目标是“人性化”&#xff0c;即让编程更加简单、自然和可读性强。Ruby的开发历程可以分为以下几个阶段。 1. Rub…

Python-DQN代码阅读(12)

目录 1.代码 1.1代码解读 1.2 代码分解 1.2.1 latest_checkpoint tf.train.latest_checkpoint(checkpoint_dir) 1.2.2 saver.restore(sess, latest_checkpoint) 1.2.3 sess.run(tf.global_variables_initializer()) 1.2.4 deep_q_learning() 1.3 输出结果 1.4 问题 1…

如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)

没有前言直接开始正文&#xff0c;搭建一个博客需要服务器&#xff0c;域名&#xff0c;博客程序。 博客程序常用的有wordpress&#xff0c;z-blog&#xff0c;typecho等等&#xff0c;其中wordpress和z-blog最为简单&#xff0c;typecho需要一定的技术含量&#xff0c;这里暂…