Qt属性系统

一、一些概念

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();
}
相关推荐
Qimooidea2 分钟前
祁木 CAD Translator 深度评测:从参数解析到工程交付实战
java·开发语言·人工智能·机器翻译
数行拙笔9 分钟前
Redis---set类型
数据库·redis·缓存
小白学大数据15 分钟前
企业内网场景下 Python 自定义 CA 证书信任链的正确配置方法
开发语言·网络·python·信任链
Java面试题总结26 分钟前
使用 Python 在 Excel 中添加和自定义文本框
开发语言·python·excel
Leon-Ning Liu27 分钟前
【真实经验分享】Oradebug抓取阻塞源SQL语句
数据库
观远数据32 分钟前
消费品牌选型BI的能力边界:三类差异化场景的适配清单与排除项
数据库·人工智能·microsoft
geovindu39 分钟前
CSharp: Recursion Algorithm
开发语言·后端·算法·c#·递归算法
TlSfoward41 分钟前
爬虫指纹漂移监控与回归测试:JA3/JA4 变化为什么会影响线上验证 TLSFOWARD
数据库·爬虫·网络协议·搜索引擎
dsyyyyy110143 分钟前
用JavaScript实现排序算法
开发语言·javascript·排序算法
CHANG_THE_WORLD1 小时前
逐层拆解:C++ 虚函数从对象内存到手工调用的完整过程
java·开发语言·c++