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();
}
相关推荐
小江的记录本2 分钟前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi6 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
止语Lab12 分钟前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
yaoxin52112326 分钟前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
小短腿的代码世界30 分钟前
Qt日志系统深度解析:从qDebug到企业级日志框架
开发语言·qt
dFObBIMmai36 分钟前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw039 分钟前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209251 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
REDcker1 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
ACP广源盛139246256732 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑