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