zoukankan      html  css  js  c++  java
  • qt--Q_PROPERTY自定义属性

    Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类

    格式:

    Q_PROPERTY(type name             
          READ getFunction
          [WRITE setFunction]
          [RESET resetFunction]
          [NOTIFY notifySignal]
          [DESIGNABLE bool]
          [SCRIPTABLE bool]
          [STORED bool]
          [USER bool]
          [CONSTANT]
          [FINAL])

    说明:type name     定义属性,类型可以是QVariant支持的任一类型,又或者是我们自定义的类型--属性就是类的数据成员  --必须的

    READ getFunction    读取属性的函数,必须返回属性类型的值或指针或引用--必须的

    WRITE setFunction   设置属性值的函数,必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用

    RESET resetFunction   reset函数能够把property设置成其默认状态,必须返回void并且不带有任何参数

    NOTIFY notifySignal     定义信号,如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值

    USER bool       USER属性 表面是否可以被用户所编辑

    CONSTANT     CONST设定属性是不可修改的 所以不能跟WRITE或者NOTIFY同时出现

    FINAL     表明该属性不会被派生类中重写

    READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中 

    test.h

    #ifndef TEST_H
    #define TEST_H
    
    #include <QObject>
    
    class Test : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)  //自定义属性--类成员函数
    
    public:
        explicit Test(QObject *parent = nullptr);
        
        void setEnabled(bool e);  //写函数
        bool isEnabled();          //读函数
        bool enabled;  //创建属性--成员变量
    
    signals:
    
    };
    
    #endif // TEST_H

    test.cpp

    #include "test.h"
    
    Test::Test(QObject *parent) : QObject(parent)
    {
    
    
    }
    
    void Test::setEnabled(bool e)
    {
        enabled = e;
    }
    
    bool Test::isEnabled()
    {
        return enabled;
    }

    win.h

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include "test.h"   //导入包含自定义属性的类
    
    #include <QDebug>
    
    class Win : public QWidget
    {
        Q_OBJECT
    
    public:
        Win(QWidget *parent = nullptr);
        ~Win();
    };
    #endif // WIN_H

    win.cpp

    #include "win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
    {
        Test *test = new Test;   //创建具有自定义属性的类对象
        test->setProperty("enabled", true);  //设置属性--方法一
        //test->setEnabled(true);  //设置属性--方法二
    
        QVariant v=test->property("enabled");  //返回属性值--方法一
        //QVariant(bool, true)
        bool b=v.toBool();  //转化为bool类型
        b=test->isEnabled();  //返回属性值--方法二
    
    
        qDebug()<<b;
    
    
    }
    
    Win::~Win()
    {
    }

    上面工程下载:链接:https://pan.baidu.com/s/1bhfqfGomPm-b4raCpe_HzQ    提取码:6666     

     

  • 相关阅读:
    Java学习的第二十八天
    Java学习的第二十七天
    第五章 作用域闭包
    第4章提升
    第3章函数作用域和块级作用域
    Vant中List列表下拉加载更多
    获取当前时间
    js比较两个时间的大小
    边框引起页面抖动
    计算两个数的百分比,保留两位小数
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13877809.html
Copyright © 2011-2022 走看看