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();
}
相关推荐
郝学胜-神的一滴9 小时前
Qt 高级开发 031:QListWidget图标布局实战
开发语言·c++·qt·程序人生·软件构建·用户界面
caimouse9 小时前
Reactos 第 8 章 结构化异常处理 — 8.4 软异常
服务器·开发语言·windows
艾莉丝努力练剑9 小时前
【Qt】界面优化:绘图API
linux·运维·开发语言·网络·qt·tcp/ip·udp
牛油果子哥q9 小时前
队列(Queue)深度精讲,先进先出原理、顺序/链式/循环队列、STL queue底层、栈队列互模拟与面试考点全解
开发语言·c++·面试
IT策士9 小时前
Redis 从入门到精通:缓存经典难题 —— 穿透、击穿、雪崩
数据库·redis·缓存
聆风吟º9 小时前
【Python编程日志】Python基础数据类型完整梳理
开发语言·python·数据类型
湘美书院--湘美谈教育9 小时前
湘美谈教育湘美书院考古教育系列:湖南史前文化序列整理
大数据·数据库·人工智能·深度学习·神经网络·机器学习
IT策士9 小时前
Redis 从入门到精通:内存管理与淘汰策略
数据库·redis·缓存
承渊政道9 小时前
【MySQL数据库学习】(MySQL内置函数)
数据库·学习·mysql·ubuntu·bash·数据库开发·数据库系统
weixin_307779139 小时前
在 Azure 上构建数据库路由与异构整合层:原理、方案与最佳实践
数据库·人工智能·后端·云计算·azure