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     

 

原文地址:https://www.cnblogs.com/liming19680104/p/13877809.html