解析Qt元对象系统(四) 属性系统(确实比较方便)
官方解释
我们在Qt源码中可以看到一个QObject的子类经常会用到一些Q_开头的宏,例如QMainWindow类开始部分代码是这样的:
Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize)
Q_PROPERTY(Qt::ToolButtonStyle toolButtonStyle READ toolButtonStyle WRITE setToolButtonStyle)
......
public:
enum DockOption {
AnimatedDocks = 0x01,
AllowNestedDocks = 0x02,
AllowTabbedDocks = 0x04,
ForceTabbedDocks = 0x08, // implies AllowTabbedDocks, !AllowNestedDocks
VerticalTabs = 0x10, // implies AllowTabbedDocks
GroupedDragging = 0x20 // implies AllowTabbedDocks
};
Q_ENUM(DockOption)
Q_DECLARE_FLAGS(DockOptions, DockOption)
Q_FLAG(DockOptions)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这几个宏也不是标准C++的内容,它们属于Qt的属性系统,是元对象系统的一部分。使用属性系统的类必须是QObject的子类,还得包含宏Q_OBJECT。
在标准C++中,为了保证封装性,我们经常声明一个私有变量,然后声明两个公有函数,即set函数和get函数。在Qt中我们可以使用宏Q_PROPERTY来实现这些,还包括信号的发射,后者实际是在set函数中实现的。
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal] )
Q_PROPERTY(type name
MEMBER memberName
[READ getFunction]
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal] )
1
2
3
4
5
6
7
8
9
10
11
12
这是Q_PROPERTY的两种简单而常用的形式。
type 是指属性的类型,可以是 C++ 标准类型、类名、结构体、枚举等
name 属性的名字,仅仅是一个用于标识属性的名字,不是实际存在的成员变量
READ 标出该属性的读函数 getFunction,Qt 属性的读函数通常省略 get 三个字母。
WRITE 标出该属性的写函数 setFunction,中括号表示可选,写函数不是必须的。
RESET 标出该属性的重置函数
resetFunction,重置函数将属性设为某个默认值,中括号表示可选,重置函数不是必须的。
NOTIFY 标出该属性变化时发出的通知信号 notifySignal,中括号表示可选,这个信号不是必须的。
在明确标出属性使用的成员变量的情况下,属性的读写函数可以省略不写,Qt 的 moc 工具会自动为成员变量生成读写代码。比如:
READ, WRITE以及RESET可以被继承,也可以是虚函数。property的类型可以是QVariant支持的任何类型,也可以是用户定义的类型,这就是Q_ENUM()的作用了。
枚举类型必须用Q_ENUM()宏注册,这也是元对象系统的一部分,然后就可以使用QObject::setProperty(); 我们必须为READ和WRITE提供自己的声明。
结合以上几条,我们这样写一个类:
class MainWindow : public QMainWindow
{
Q_OBJECT
Q_PROPERTY(int value MEMBER m_value NOTIFY valueChanged);
Q_PROPERTY(Priority prioity MEMBER m_priority NOTIFY priChanged);
public:
MainWindow(QWidget* parent= nullptr);
~MainWindow();
enum Priority{Low,High, VeryHigh};
Q_ENUM(Priority);
signals:
void valueChanged();
void priChanged();
private:
Ui::MainWindow* ui;
int m_value;
Priority m_priority;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这样就可以在类外调用相关函数了:
m.setProperty("value",15);
m.setProperty("prioity",MainWindow::VeryHigh);
qDebug()<<"value:"<<m.property("value").toInt();
qDebug()<<"prioity value:"<<m.property("prioity").toInt();
qDebug()<<m.dynamicPropertyNames();
1
2
3
4
5
6
还有一个宏Q_FLAG(), 它与Q_ENUM()类似, 也是注册枚举类型, 但可以使用|操作。一个I/O类可能有枚举值Read和Write ,那么QObject::setProperty()就可以接受Read | Write。记得必须用Q_DECLARE_FLAGS完成注册
还有一个宏Q_CLASSINFO(),在类的声明里添加类附加信息,比如:
Q_CLASSINFO("Version", "1.0.0")
1
附加信息也是成对的“名称-值”,不过注意 名称和值 都是普通字符串。如果希望在运行时查询类的附加信息,可以先用 QObject::metaObject() 获取当前对象包含的元对象数据,然后使用 QMetaObject::classInfo 函数查询某个序号的附加信息:
//类内声明
Q_CLASSINFO("Version", "1.0.0")
Q_CLASSINFO("Author", "Winland")
//类外使用
//获取类的附加信息
const QMetaObject *pMO = w.metaObject();
//附加信息个数
int nInfoCount = pMO->classInfoCount();
//打印所有的附加信息
for(int i=0; i<nInfoCount; i++)
{
QMetaClassInfo info = pMO->classInfo(i);
qDebug()<<info.name()<<"\t"<<info.value();
}
---------------------
作者:SilentAssassin
来源:CSDN
原文:https://blog.csdn.net/yao5hed/article/details/81142358?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
解析Qt元对象系统(四) 属性系统(确实比较方便)的更多相关文章
- 解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod(automatic connection从Qt4.8开始的解释已经与之前不同,发送对象驻足于哪一个线程并不重要,起到决定作用的是接收者对象所驻足的线程以及发射信号(该信号与接受者连接)的线程是不是在同一个线程)good
概述查看Qt源码可知,Q_INVOKABLE是个空宏,目的在于让moc识别. 使用Q_INVOKABLE来修饰成员函数,目的在于被修饰的成员函数能够被元对象系统所唤起. Q_INVOKABLE与QMe ...
- QtCore是Qt的精髓(包括五大模块:元对象系统,属性系统,对象模型,对象树,信号槽)
作者:小豆君的干货铺链接:https://www.zhihu.com/question/27040542/answer/218384474来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Qt 元对象系统(Meta-Object System)(不管是否使用信号槽,都推荐使用)
Qt 元对象系统(Meta-Object System) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的对象提供了一个基类. 宏:Q_OBJECT,通常可以声明在类 ...
- Qt元对象和属性系统详解
Qt 是一个用标准 C++ 编写的跨平台开发类库,它对标准 C++ 进行了扩展,引入了元对象系统.信号与槽.属性等特性,使应用程序的开发变得更高效. 本节将介绍 Qt 的这些核心特点,对于理解和编写高 ...
- Qt元对象(Meta-Object)系统与反射
反射 -在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意 ...
- Qt元对象系统简介
在Qt中提供了c++的扩展,提供了一种元对象系统的机制,(meta-object-system)的机制.其中包含了信号与槽的内部机制,能够访问到QObject子类的元对象信息的功能. Q_OBJECT ...
- Qt 元对象系统(Meta-Object System)
(转自:http://blog.csdn.net/aladdina/article/details/5496891) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的 ...
- qt 元对象系统
元对象系统 Qt中的元对象系统是用来处理对象间通讯的信号/槽机制.运行时的类型信息和 动态属性系统. 它基于下列三类: QObject类: 类声明中的私有段中的Q_OBJECT宏: 元对象编译器(mo ...
- Qt——元对象和属性机制
http://www.cnblogs.com/hellovenus/p/5582521.html 一.元对象 元对象(meta object)意思是描述另一个对象结构的对象,比如获得一个对象有多少成员 ...
随机推荐
- Quartz中时间参数说明 即Cron表达式
Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 表1 Cron表达式时间字段 位置 时间域名 允许值 允 ...
- WEB开发模式浅析
WEB技术随着互联网的崛起而崛起,又随着移动互联网的发展而呈现更加多样化的趋势. 黑暗时代:大约在2005年以前,所谓的WEB开发主要还是美工的活,HTML/CSS占主导,Dreamwaver做为页面 ...
- [Windows Server 2008] ASP.net安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装ASP.n ...
- POJ_3013_最短路
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23630 Accepted: 5 ...
- windows下使用批处理设置环境变量
1. 设置临时环境变量 set BAT_HOME=c:\bat 此命令只对当前窗口有效,批处理或cmd窗口一关闭,变量就恢复原来的值了. 2. 设置永久环境变量 方法一 setx BAT_HOME C ...
- 用C#在Visual Studio写Javascript单元测试(Firefox内核)
引用nuget包: 注意:Geckofx45 nuget包必须是最后引用,否则初始化会出错 编写JsRunner using Gecko; using System; using System.Col ...
- Sersync+Rsync实现数据文件实时同步
rsync+inotify-tools与rsync+sersync架构的区别1,rsync+inotify-tools只能记录下被监听的目录发生的变化(增删改)并没有把具体变化的文件或目录记录下来在同 ...
- Nginx +tomcat 实现负载均衡集群
一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡的Tomcat集群: 三. 步骤 1.首先下载Nginx ...
- odoo 权限杂记
最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...
- python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...