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();
}
相关推荐
余槐i3 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹3 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo3 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
美狐美颜SDK开放平台5 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
用户8334423966146 小时前
从批量操作到任务中心,再到现场工作台:DeviceForge v2.10—v2.12 完整演进
qt
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
花间相见6 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端