Qt的属性系统是一种机制,允许对象动态地添加、移除和查询属性。属性是对象的特征或状态,可以是基本数据类型(如整数、字符串等)或自定义类型。属性系统使得在运行时能够动态地访问和修改这些属性,而无需改变对象的类定义或重新编译代码。
主要组成部分包括:
-
Q_PROPERTY宏:在C++类中使用
Q_PROPERTY
宏可以声明属性。这样做可以让属性在Qt的元对象系统(Meta Object System)中注册,从而可以通过元对象系统进行动态访问和操作。 -
属性定义:通过
Q_PROPERTY
宏,可以为C++类添加属性,并指定属性的名称、类型、读取函数、写入函数以及其他元数据。 -
属性访问:一旦属性被声明,就可以使用Qt的元对象系统来查询、设置和监视这些属性。通过属性名称,可以在运行时动态地读取和修改对象的属性值。
-
信号和槽:属性值的更改可以触发信号,从而允许其他对象对属性变化作出响应。这使得对象之间可以通过信号和槽机制进行通信,实现更松散的耦合。
使用Qt的属性系统,可以使程序更加灵活和可扩展。它常用于实现自定义控件、数据模型、以及与图形界面元素的交互等方面。
关键字
-
READ:指定一个读取属性值的函数。当你需要读取属性值时,将调用此函数。
-
WRITE:指定一个设置属性值的函数。当你需要修改属性值时,将调用此函数。
-
MEMBER:与属性关联的成员变量。它用于指定在内部存储属性值的成员变量。
-
RESET:可选的,指定一个函数来设置属性的默认值。
-
NOTIFY:可选的,设置一个信号,当属性值发生变化时发射该信号,通知其他对象属性的改变。
-
DESIGNABLE:指示属性是否在Qt Designer中可见,默认为true。如果设置为false,属性将不会在Qt Designer中显示。
-
CONSTANT:指定属性值是一个常数。具有CONSTANT关键字的属性不能有WRITE和NOTIFY关键字,它们的值在运行时不能更改。
-
FINAL:指定属性是最终属性,不能被子类重载。
-
学习分享示例
-
#ifndef PROPERTY_H #define PROPERTY_H #include <QWidget> namespace Ui { class Property; } struct ceshi { ceshi() {} int a; bool operator!=(ceshi &c) { if (this->a != c.a) { return false; } return true; } }; Q_DECLARE_METATYPE(ceshi) class Property : public QWidget { Q_OBJECT Q_PROPERTY(ceshi ccc MEMBER ccc NOTIFY cChange) public: explicit Property(QWidget *parent = nullptr); ~Property(); void oncChange(); signals: void cChange(); private slots: void on_pushButton_clicked(); private: Ui::Property *ui; ceshi ccc; }; #endif // PROPERTY_H
#include "property.h" #include "ui_property.h" #include <QDebug> #include <QRandomGenerator> #include <QMetaObject> Property::Property(QWidget *parent) : QWidget(parent), ui(new Ui::Property) { ui->setupUi(this); connect(this, &Property::cChange, this, &Property::oncChange); } Property::~Property() { delete ui; } void Property::oncChange() { qDebug() << "成员:" << ccc.a; qDebug() << "属性:" << this->property("ccc").value<ceshi>().a; } void Property::on_pushButton_clicked() { ccc.a= QRandomGenerator::global()->bounded(255); emit cChange(); }