Qt属性系统详解
1、属性系统有什么用?
一般我们说一个类有什么属性,指的就是这个类有啥成员变量。比如People类中有个int age的私有成员变量,我们就可以说这个People类有个“年龄”属性可以更改读取。
Qt提供的属性系统,作用就是把类的信息暴露出来成为通用的、大家都认识的信息。比如用C++语言写的People类中中有个int age变量,但所如果用QML语言去读取就会出问题,因为QML有自己的规则,它不认识C++规则。用Qt的属性系统就可以解决这个问题,当一个类的成员变量或者成员函数用属性系统处理一下,它们就从C++内部中暴露出来,而且大家都认得。
属性系统是专门为元对象系统服务
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
2、属性详解
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:表示所定义的属性不能被子类重载。
3、属性定义
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;
}
4、属性使用
如果是用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”的属性值就可以。
5、类的附加信息
属性系统还有一个宏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();
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- Qt面试笔试题问答经验总结
- QT软件开发-得到唯一文件名-当前时间与GUID
- QT多线程实战_Qt多线程开发项目
- Qt-改变tabBar位置并改变文字方向
- C/C++ Qt Tree与Tab组件实现分页菜单
- C/C++ Qt 编译打包项目
- Qt官方示例-书评展示
- Qt官方示例-样式插件
- 编程在Linux下学习Qt界面编程(linux下qt界面)
- Linux串口应用开发实践——Qt篇(linux串口qt)
- Qt元对象和属性系统详解
- Linux 环境下运用 Qt 编程的秘籍(linux下的qt编程)
- 技术深入探索Linux下的Qt开发(基于linux的qt开发)
- 版本Qt终于发布了Linux版本(qt发布linux)
- 利用Qt快速调用Linux程序简易指南(qt调用linux程序)
- Linux下高效安装Qt(linux下安装qt)
- Linux上静态编译Qt应用实现方案(linux静态编译qt)
- 标题:精彩体验:基于Linux系统的Qt 5.7(linuxqt5.7)
- Dooble是用Qt4写的另外一款WebKit浏览器,主要在保护用户隐私方面取胜。虽然它和其他浏览器提供的安全性相差不打,但是也有一些特有的属性比如内含的桌面等。Dooble桌面使得用户可以在增加桌面背景的同时添加应用程序启动,除了从软件包管理器安装外,还可以使用Ubuntu 10.10版本0.07安装,此时的Dooble版本为1.14,同时还要有Qt编码工具如qt4-qmake等。
- Qt与Oracle数据库的高效结合(qt数据库oracle)
- 如何在Linux下编译Qt?(linux下编译qt)
- linux系统启动Qt图形界面简易指南(linux启动qt)
- 的整合『使用 Qt 与MySQL实现创新性的数据库应用』(qt与mysql)
- 开启Linux Qt支持中文显示(linuxqt显示中文)
- 快速搭建Qt环境中的MySQL数据库(qt配置mysql数据库)
- 快速使用QT进行MySQL数据库操作(qt使用mysql数据库)
- 集成开发Linux与Qt集成开发:实现无缝交互(linux与qt)
- 如何在Qt应用程序中访问MySQL数据库?(qt访问mysql)
- 使用 Linux 和 Qt 实现高效应用程序开发(linuxqt使用)
- 如何在Linux系统中安装QT软件?简明指南分享(qtlinux安装)
- Dooble是用Qt4写的另外一款WebKit浏览器,主要在保护用户隐私方面取胜。虽然它和其他浏览器提供的安全性相差不打,但是也有一些特有的属性比如内含的桌面等。Dooble桌面使得用户可以在增加桌面背景的同时添加应用程序启动,除了从软件包管理器安装外,还可以使用Ubuntu 10.10版本0.07安装,此时的Dooble版本为1.14,同时还要有Qt编码工具如qt4-qmake等。
- Linux Qt窗口:快速构建你的GUI界面(linux qt 窗口)