学习Qt之属性系统详解_qt c++ 中定义属性-程序员宅基地

技术标签: # QT学习记录  


一、属性系统有什么用?

一般我们说一个类有什么属性,指的就是这个类有啥成员变量。比如People类中有个int age的私有成员变量,我们就可以说这个People类有个“年龄”属性可以更改读取。

Qt提供的属性系统,作用就是把类的信息暴露出来成为通用的、大家都认识的信息。比如用C++语言写的People类中中有个int age变量,但所如果用QML语言去读取就会出问题,因为QML有自己的规则,它不认识C++规则。用Qt的属性系统就可以解决这个问题,当一个类的成员变量或者成员函数用属性系统处理一下,它们就从C++内部中暴露出来,而且大家都认得
在这里插入图片描述

属性系统是专门为元对象系统服务


二、属性详解

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

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

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

注意

getFunction的返回值类型必须为type;
setFunction的返回值必须为空,而且必须带一个参数
例如:type getFunction();void setFunction(type n);
指定了MEMBER之后就能再指定READ和WRITE

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

Q_PROPERTY()宏定义属性的一些关键字的意义如下:

  • READ:指定一个读取属性值的函数,没有MEMBER关键字必须设置READ。
  • WRITE:指定一个设定属性值的函数,只读属性没有WRITE设置。
  • MEMBER:指定一个成员变量与属性关联,成为可读科协的属性,无需再设置READ和WRITE。
  • RESET:可选,用于指定一个设置属性缺省值的函数。
  • NOTIFY:可选,用于设置一个信号,当属性值变化时发射此信号。
  • DESIGNABLE:表示属性是否在Qt Dseigner里可见,缺省为true。
  • CONSTANT:表示属性值是一个常数,对于一个对象示例,READ指定的函数返回值是常数,但是每个实例的返回值可以不一样。具体CONSTANT关键字的属性不能有WRITE和NOTIFY关键字。
  • FINAL:表示所定义的属性不能被子类重载。

三、属性定义

1. READ和WRITE

//头文件
Class Widget : public QObject
{
    
		Q_PROPERTY(int age READ readAge WRITE setAge)
		Q_OBJECT
public:
		explicit Widget(QWidget *parent = 0);
   		 ~Widget();
   		 
		int my_age;
		
		int readAge();
		void setAge(int n);
}

//源文件
int Widget::readAge()
{
    
		return my_age;
}
void Widget::setAge(int n)
{
    
		my_age = n;
}

2. MEMBER

//头文件
Class Widget : public QObject
{
    
		Q_PROPERTY(int age MEMBER my_age NOTIFY ageChanged)
		Q_OBJECT
public:
		explicit Widget(QWidget *parent = 0);
   		 ~Widget();

		int my_age;

		int readAge();
		void setAge(int n);
signal:
		void ageChanged();
}

//源文件
int Widget::readAge()
{
    
		return my_age;
}
void Widget::setAge(int n)
{
    
		my_age = n;
}

四、属性使用

如果是用READ、WRITE,直接调用指定的函数即可,例如:

Widget *w = new Widget;
w->setAge(true);

如果是用MEMBER,那么用QObject的property()setProperty()两个函数,如:

Widget *w = new Widget;
w->property("age");
w->setProperty("age",18);

两种方法,使用WRITE效率更高、速度更快,而且在编译阶段就可以进行类型检查。缺点就是还没运行前你就得了解这个类使用readAge()这个函数。而采用MEMBER方式时,我们不需要知道这个类有啥函数、有啥变量,只需要知道这个类有一个叫“age”的属性值就可以。


五、类的附加信息

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

//头文件
Class Widget : public QObject
{
    
		Q_CLASSINFO("author","Wang")
		Q_CLASSINFO("version","3.0.1")
		Q_OBJECT
public:
		explicit Widget(QWidget *parent = 0);
   		 ~Widget();
}

//使用
Widget *w = new Widget;
w->metaObject()->classInfo(0).name();
w->metaObject()->classInfo(0).value();

w->metaObject()->classInfo(1).name();
w->metaObject()->classInfo(1).value();
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_robot_strange/article/details/106349945

智能推荐

HDLBits刷题全记录(三)_waveform sum,carry-程序员宅基地

文章浏览阅读499次。文章目录3.CircuitsCombinational LogicBasic GatesWireGNDNORAnother gateTwo gatesMore logic gates7420 chipTruth tablesTwo-bit equalitySimple circuit ASimple circuit BCombine circuits A and BRing or vibrateThermostat3-bit population countGates and vectorsEven lon_waveform sum,carry

oracle 更改adr路径,11g修改listner ADR-程序员宅基地

文章浏览阅读274次。修改listner ADR 有2种方法:一、禁用ADR,在lsnrctl 命令下修改log_directory的值,这也是网上大多数的修改方式。su - gridcd $ORACLE_HOME/netwrok/adminvi listener.oraDIAG_ADR_ENABLED_LISTENER=OFF --->禁用ADR修改好后,需要reload。[oracle:/oracle/app..._oracle11 集群修改 listener.ora diag_adr_enabled = off

宽带拨号失败服务器未响应什么意思,宽带拨号服务器未响应-程序员宅基地

文章浏览阅读584次。宽带拨号服务器未响应 内容精选换一换外部镜像文件在从原平台导出前,没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和KVM Guest OS driver(UVP VMTools),未安装会对云服务器运行时的性能产生影立即对策略下的资源进行一...

对网络日志分析的几个方面-程序员宅基地

文章浏览阅读2.9k次。1、关键字排行分析 在搜索过程中,用户跟搜索引擎的交互都是通过输入的主题或者关键词来进行的,因此通过分析用户的査询主题对了解用户的兴趣非常有效,但还是充分表明有很多重复的查询请求,如果能提高这些词的查询质量就能使整体检索的质量提高很多,可以考虑引入缓存机制和建立动态的索引机制。2、URL排行分析 用户提交查询关键词后,搜索引擎根据关键词返回相应的查询结果,用户浏览该返回_网络日志分析

LaTex字体、符号汇总_latex画图字体-程序员宅基地

文章浏览阅读55次。LaTex字体、符号汇总_latex画图字体

在React项目中使用表格‘无缝滚动’_react 无缝滚动表格-程序员宅基地

文章浏览阅读3.7k次。在react项目中使用表格无缝滚动!一下是一个表格无缝滚动的封装组件import React from 'react';import { observer } from 'mobx-react';import { Table, Input, InputNumber, Popconfirm, Form } from 'antd';import './index.less';@obser..._react 无缝滚动表格

随便推点

电话手表安装linux系统吗,linux下dandroid wear开发环境搭建之手表连接调试-程序员宅基地

文章浏览阅读504次。开发时连接调试有两种方式:一种是手机与电脑链接,开启蓝牙调试后电脑的开发环境里可以识别手表,具体方式参照google官方教程.第二种是电脑与手表直接链接,这种方式与手机app开发没有区别,eclipse和adb都可以直接操作手表.这里记录下用第二种方式时遇到的问题和解决办法,在连接手表后发现adb device和eclipse都识别不了设备,显示各种错误,如:$ adb devicesList o..._手表刷linux

【IBM WebSphere MQ】命令集_ibm清理mq队列里的数据-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏11次。查MQ版本dspmqver显示所有队列管理器dspmq显示指定队列管理器dspmq -m name新建队列管理器crtmqm name启动队列管理器strmqsc name进入管理器命令runmqsc name查询队列管理器里的队列display queue(*) # 首先需要进入队列管理器队列类型QREMOTE 远程队列QLOCAL 本地队列QMODEL 模板队列QALTAS 别名队列关闭通道验证._ibm清理mq队列里的数据

Android 动画学习(一)之View Animation_android中view中动画持续的时间-程序员宅基地

文章浏览阅读8.8k次,点赞12次,收藏31次。转载请注明出处:Android动画初步 动画(Animation)在我们日常的Android开发工作当中使用得较为频繁,尤其对于Android游戏这个动画的集合体,掌握动画开发的重要性毋庸置疑。同样的,在Android应用开发中我们也经常使用动画效果来提升APP用户体验,比如应用中的图片的旋转,页面和页面之间的淡入淡出、左右渐入渐出切换效果等等。那从今天开始我们将进入_android中view中动画持续的时间

android多点触控技术-程序员宅基地

文章浏览阅读46次。为什么80%的码农都做不了架构师?>>> ...

Kafka+Zookeeper+Filebeat+ELK 搭建日志收集系统-程序员宅基地

文章浏览阅读145次。ELKELK目前主流的一种日志系统,过多的就不多介绍了Filebeat收集日志,将收集的日志输出到kafka,避免网络问题丢失信息kafka接收到日志消息后直接消费到LogstashLogstash将从kafka中的日志发往elasticsearchKibana对elasticsearch中的日志数据进行展示image环..._filebeat squid

html put 方法,HTML canvas putImageData() 方法-程序员宅基地

文章浏览阅读567次。在线示例下面的代码使用getImageData()复制画布上指定矩形的像素数据,然后使用putImageData()将图像数据放回画布上:示例html>HTMLcanvasgetImageData()方法使用-基础教程(nhooo.com)您的浏览器不支持HTML5canvas标签。varc=document.getElementById("myCanvas");varctx=..._多次调用putimagedata

推荐文章

热门文章

相关标签