一、一些概念
Qt属性系统是基于元对象系统(Meta-Object System) 实现的一套属性管理机制,允许你为 QObject 的子类定义属性,这些属性具备以下特性:
1.支持读写、通知(值变化时发信号);
2.可通过元对象动态访问(运行时获取 / 修改属性);
3.兼容 Qt 的信号槽、反射、序列化等功能。
二、Qt属性定义
1.类继承自 QObject;
2.类中声明 Q_OBJECT 宏(启用元对象系统);
3.使用 Q_PROPERTY 宏。
cpp
Q_PROPERTY(
type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL]
)
说明:不在[]内的参数表示必须要,在[]内的参数表示可选。
三、测试
MyClass01.h
cpp
#ifndef MYCLASS01_H
#define MYCLASS01_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
// 核心:定义属性
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
public:
explicit MyClass(QObject *parent = nullptr) : QObject(parent), m_name(""){}
// 1. READ:属性的读取函数(必须)
QString name() const { return m_name; }
// 2. WRITE:属性的写入函数(可选,只读属性可省略)
void setName(const QString &newName) {
if (m_name != newName) {
m_name = newName;
emit nameChanged(); // 触发通知信号
}
}
signals:
// 3. NOTIFY:属性变化时的通知信号(可选,建议添加)
void nameChanged();
private:
// 底层存储变量
QString m_name;
};
#endif // MYCLASS01_H
main.c
cpp
#include <QCoreApplication>
#include <QMetaObject>
#include <QObject>
#include <QMetaType>
#include <QDebug>
#include "MyClass01.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass obj;
/*直接调用类的成员方法*/
obj.setName("day6");
//输出 "day6"
qDebug() << "Name:" << obj.name();
/*通过元对象动态访问*/
obj.setProperty("name", "day6 Property");
// 获取属性
QVariant nameVar = obj.property("name");
//输出 "day6 Property"
qDebug() << "Dynamic Name:" << nameVar.toString();
// 连接属性变化信号
QObject::connect(&obj, &MyClass::nameChanged, []() {
qDebug() << "Name property changed!";
});
obj.setProperty("name", "New Name"); // 触发nameChanged信号
//输出:Name property changed!
/*检查属性是否存在*/
//输出 1 (存在)
qDebug() << obj.metaObject()->indexOfProperty("name");
//输出 -1 (不存在)
qDebug() << obj.metaObject()->indexOfProperty("name1");
return 0;
//return a.exec();
}