Qt属性系统

 Qt的属性系统是一种机制,允许对象动态地添加、移除和查询属性。属性是对象的特征或状态,可以是基本数据类型(如整数、字符串等)或自定义类型。属性系统使得在运行时能够动态地访问和修改这些属性,而无需改变对象的类定义或重新编译代码。

主要组成部分包括:

  1. Q_PROPERTY宏:在C++类中使用Q_PROPERTY宏可以声明属性。这样做可以让属性在Qt的元对象系统(Meta Object System)中注册,从而可以通过元对象系统进行动态访问和操作。

  2. 属性定义:通过Q_PROPERTY宏,可以为C++类添加属性,并指定属性的名称、类型、读取函数、写入函数以及其他元数据。

  3. 属性访问:一旦属性被声明,就可以使用Qt的元对象系统来查询、设置和监视这些属性。通过属性名称,可以在运行时动态地读取和修改对象的属性值。

  4. 信号和槽:属性值的更改可以触发信号,从而允许其他对象对属性变化作出响应。这使得对象之间可以通过信号和槽机制进行通信,实现更松散的耦合。

使用Qt的属性系统,可以使程序更加灵活和可扩展。它常用于实现自定义控件、数据模型、以及与图形界面元素的交互等方面。

关键字

  1. READ:指定一个读取属性值的函数。当你需要读取属性值时,将调用此函数。

  2. WRITE:指定一个设置属性值的函数。当你需要修改属性值时,将调用此函数。

  3. MEMBER:与属性关联的成员变量。它用于指定在内部存储属性值的成员变量。

  4. RESET:可选的,指定一个函数来设置属性的默认值。

  5. NOTIFY:可选的,设置一个信号,当属性值发生变化时发射该信号,通知其他对象属性的改变。

  6. DESIGNABLE:指示属性是否在Qt Designer中可见,默认为true。如果设置为false,属性将不会在Qt Designer中显示。

  7. CONSTANT:指定属性值是一个常数。具有CONSTANT关键字的属性不能有WRITE和NOTIFY关键字,它们的值在运行时不能更改。

  8. FINAL:指定属性是最终属性,不能被子类重载。

  • 学习分享示例

  • #ifndef PROPERTY_H
    #define PROPERTY_H
    
    #include <QWidget>
    
    namespace Ui {
    class Property;
    }
    
    struct ceshi
    {
        ceshi()
        {}
        int a;
        bool operator!=(ceshi &c)
        {
            if (this->a != c.a)
            {
                return false;
            }
            return true;
        }
    };
    Q_DECLARE_METATYPE(ceshi)
    
    class Property : public QWidget
    {
        Q_OBJECT
        Q_PROPERTY(ceshi ccc MEMBER ccc NOTIFY cChange)
    public:
        explicit Property(QWidget *parent = nullptr);
        ~Property();
    
        void oncChange();
    
    
    signals:
        void cChange();
    
    private slots:
    
        void on_pushButton_clicked();
    
    private:
        Ui::Property *ui;
    
        ceshi ccc;
    };
    
    #endif // PROPERTY_H
    
    #include "property.h"
    #include "ui_property.h"
    #include <QDebug>
    #include <QRandomGenerator>
    #include <QMetaObject>
    Property::Property(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Property)
    {
        ui->setupUi(this);
        connect(this, &Property::cChange, this, &Property::oncChange);
    }
    
    Property::~Property()
    {
        delete ui;
    }
    
    void Property::oncChange()
    {
        qDebug() << "成员:" << ccc.a;
        qDebug() << "属性:" << this->property("ccc").value<ceshi>().a;
    }
    
    void Property::on_pushButton_clicked()
    {
        ccc.a= QRandomGenerator::global()->bounded(255);
    
        emit cChange();
    }
    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值