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();
}
相关推荐
李广坤7 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端