• QT属性系统实现get与set 一个变量值得功能-变量读取与写入


    QT属性系统实现get与set 一个变量值得功能-变量读取与写入

    关于属性注册宏Q_PROPERTY的介绍,Q_PROPERTY宏的使用语法如下:

    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] )

    在上述Q_PROPERTY宏定义的语法中,[ ]里的表示可选项,大写字母的选项名(READ)是不能更改的,小写字母除类型(int、bool等直接给定对应类型的值)外部分(type)是自行命名定义的,各选项之间用空格隔开
     

     Q_PROPERTY(QString userName READ getUserName WRITE setUserName NOTIFY userNameChanged)//注册属性userName

    各选项的含义说明:

    type:表示属性类型,需是QVariant支持的类型(具体参考之前QVariant 类的介绍)
    name:表示指定属性名称
    READ getFunction:其中READ表示可读, getFunction表示读取属性值的函数名,可自行设定
    注:若没有指定 MEMBER 变量,则必须指定 READ 函数,而且getFunction通常为const函数,返回值为属性的类型或属性类型的引用

    WRITE setFunction :WRITE表示写入, setFunction表示设置属性值函数的名称
    注:若属性为只读的则不能指定WRITE属性,setFunction的返回值必须为void且参数只能有一个

    MEMBER memberName :MEMBER表示指定成员, memberName表示被指定的类成员变量名称,类成员变量的命名上与属性应该有区分(通常命名规范中类成员变量前应添加m_以表示成员变量而属性无需添加如:成员变量m_value与属性value ),该属性用于设置成员变量memberName具备可读可写性质;注:若没指定READ则必须指定MEMBER
    RESET resetFunction :表示重置属性为默认值, resetFunction不能有参数和返回值
    NOTIFY notifySignal :表示指定与属性关联的信号notifySignal,即当属性值变化时就会触发信号notifySignal
    REVISION int :设置版本号,默认为0
    DESIGNABLE bool:表示设置属性在Qt设计师的属性编辑器中是否可见,默认为true(可见)
    SCRIPTABLE bool:表示设置属性是否可被脚本引擎访问,默认为true
    STORED bool:设置保存对象状态时是否必须保存属性值,多数情况默认为true
    USER bool:设置属性是否为可编辑属性,每一个类只能有一个USER属性指定,默认为false
    CONSTANT:表示属性值是常量,常量属性不能指定WRITE与NOTIFY选项
    FINAL:表示属性不能被子类重写
    以上方式设置的是静态属性,在Qt中的类还可以设定动态属性,所谓动态属性就是未使用Q_PROPERTY宏注册而通过调用QObject::setProperty()方法添加的属性。动态属性可通过设置无效的QVariant对象进行删除该动态属性,另外动态属性属于类对象的实例,不满足元对象属性机制,不能使用元对象获取动态属性信息,但可使用QObject::property()进行属性值的获取。

    1. QVariant property(const char *name) const
    2. 作用:获取指定名称属性的值,若指定名称的属性不存在则返回无效的QVariant
    3. bool setProperty(const char *name, const QVariant &value) 学到牛牛 www.xuedaon.com
    4. 作用:设置指定名称属性的值,若设置的属性已用Q_PROPERTY在类中注册,且值类型与属性类型兼容(Qt中可自动转换的类型)则设定属性值为value并返回true,若给定值类型不兼容则值设定无效并返回false;若设置的属性未使用宏定义Q_PROPERTY在类中注册,则动态添加指定名称的属性并设置给定值,此时也返回false
    使用setProperty和property方法也可以设置和获取静态属性信息,若属性有相关联的读取和写入函数(getFunction与setFunction,通常Qt中属性获取函数的名称定义时前面不添加get),则可使用对应的读写函数进行读取和写入。
    
    //QT属性系统
    MainWindow7_3::MainWindow7_3(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::MainWindow7_3)
    {
        ui->setupUi(this);
        MyClass *my_class=new MyClass(this);//创建MyClass类实例
        connect(my_class,&MyClass::userNameChanged,this,&MainWindow7_3::userChanged);
        my_class->setUserName("txwtech"); //设置属性值方法1,
        qDebug()<<"userName1: "<getUserName();//输出属性值方法1
        my_class->setProperty("userName","txwtech2");//使用QObject类的setProperty函数来设置属性值,方法2, setProperty->通过userName找到WRITE对应的函数
        qDebug()<<"userName2:"<property("userName").toString();//my_class->property通过userName找到READ对应的函数
    }
    1. #ifndef MAINWINDOW7_3_H
    2. #define MAINWINDOW7_3_H
    3. #include
    4. QT_BEGIN_NAMESPACE
    5. namespace Ui { class MainWindow7_3; }
    6. QT_END_NAMESPACE
    7. class MainWindow7_3 : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. MainWindow7_3(QWidget *parent = nullptr);
    12. ~MainWindow7_3();
    13. private:
    14. Ui::MainWindow7_3 *ui;
    15. private slots:
    16. void userChanged(QString);
    17. };
    18. #endif // MAINWINDOW7_3_H
    1. #include "mainwindow7_3.h"
    2. #include "ui_mainwindow7_3.h"
    3. #include "myclass.h"
    4. #include
    5. //QT属性系统
    6. MainWindow7_3::MainWindow7_3(QWidget *parent)
    7. : QWidget(parent)
    8. , ui(new Ui::MainWindow7_3)
    9. {
    10. ui->setupUi(this);
    11. MyClass *my_class=new MyClass(this);//创建MyClass类实例
    12. connect(my_class,&MyClass::userNameChanged,this,&MainWindow7_3::userChanged);
    13. my_class->setUserName("txwtech"); //设置属性值方法1,
    14. qDebug()<<"userName1: "<getUserName();//输出属性值方法1
    15. my_class->setProperty("userName","txwtech2");//使用QObject类的setProperty函数来设置属性值,方法2, setProperty->通过userName找到WRITE对应的函数
    16. qDebug()<<"userName2:"<property("userName").toString();//my_class->property通过userName找到READ对应的函数
    17. }
    18. MainWindow7_3::~MainWindow7_3()
    19. {
    20. delete ui;
    21. }
    22. void MainWindow7_3::userChanged(QString userName)
    23. {
    24. qDebug()<<"user info Changed: "<
    25. }

    myclass.h

    1. #ifndef MYCLASS_H
    2. #define MYCLASS_H
    3. #include
    4. class MyClass : public QObject
    5. {
    6. Q_OBJECT
    7. Q_PROPERTY(QString userName READ getUserName WRITE setUserName NOTIFY userNameChanged)//注册属性userName
    8. public:
    9. explicit MyClass(QObject *parent = nullptr);
    10. QString getUserName() const //实现READ 读函数
    11. {
    12. return m_userName;
    13. }
    14. void setUserName(QString userName)//实现WRITE写函数
    15. {
    16. m_userName=userName;
    17. emit userNameChanged(userName); //当属性值改变时发射该信号
    18. }
    19. signals:
    20. void userNameChanged(QString); //声明NOTIFY通知消息
    21. private:
    22. QString m_userName; //私有变量,存放userName属性的值
    23. };
    24. #endif // MYCLASS_H

    myclass.cpp

    1. #include "myclass.h"
    2. MyClass::MyClass(QObject *parent) : QObject(parent)
    3. {
    4. }

  • 相关阅读:
    【luogu P1912】诗人小G(二分栈)(决策单调性优化DP)
    企业容灾架构技术选型指南
    第二证券|超300家机构关注两大赛道龙头,透露市场增长及发展方向
    左耳听风 笔记
    1475_AURIX TC275 WDT的寄存器概览
    Flutter DataGrid教程之表格图标日历Excel完整App源码(教程含源码)
    Falcon 登陆 Hugging Face 生态
    微服务框架 SpringCloud微服务架构 3 Eureka 3.1 提供者与消费者
    C++基础——第1章:C++初探
    wxFormBuilder + Python 工具开发第三章-日记本工具树节点增、改、删功能
  • 原文地址:https://blog.csdn.net/txwtech/article/details/126911507