目录
你知道Q_PROPERTY的作用吗,可以举个例子吗
Qt Creator 在设计模式界面调用 自定义属性 (***)
Qt之自定义属性Q_PROPERTY
-----------------------------------------------------------
==================================
Q_PROPERTY是一个宏,它可以在Qt的C++类中用来声明属性。它的作用是在运行时动态地把一个属性的值与Qt的元对象系统(meta-object system)关联起来,从而使得可以使用Qt的信号和槽机制,以及访问该属性的Qt属性系统来操作这个属性。
举个例子,假设你有一个名为Person的C++类,里面有一个名为name的属性,你可以在Person类中使用Q_PROPERTY宏来声明这个属性:
class Person
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameC
//## https://stackoverflow.com/questions/22574702/progress-bar-with-qfilecopy
Q_OBJECT
Q_PROPERTY(qint64 chunksize READ chunkSize WRITE setChunkSize)
Q_PROPERTY(QVectorsourcePaths READ sourcePaths WRITE setSourcePaths)
Q_PROPERTY(QVectordestinationPaths READ destinationPaths WRITE setDestinationPaths)
————————————————
版权声明:本文为CSDN博主「基鑫阁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35749796/article/details/129558980
Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。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])
下面是一些典型的声明属性的示例:
Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(bool animation READ getAnimation WRITE setAnimation)
Q_PROPERTY(QColor barColor READ getBarColor WRITE setBarColor)
READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中。
属性的类型可以是被QVariant支持的所有类型,也可以是用户定义的类型。在下面的例子中,类QDate被当作用户自定义类型。
Q_PROPERTY(QDate data READ getDate WRITE setDate)
因为QDate是用户定义的,你必须包含
对于QMap,QList和QValueList属性,属性的值是一个QVariant,它包含整个list或map。注意Q_PROPERTY字符串不能包含逗号,因为逗号会划分宏的参数。因此,你必须使用QMap作为属性的类型而不是QMap
代码调用的例子:
class Test : public QObject {
Q_OBJECT
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
public:
Test(QObject *parent = 0) : QObject(parent) {}
virtual ~Test(){}
void setEnabled(bool e) { enabled = e; }
bool isEnabled() const { return enabled; }
private:
bool enabled;
};
然后在主函数中添加:
Test *test = new Test;
test->setProperty("enabled", true);
//test->setEnabled(true); //ok also work
if(test->property("enabled").toBool()) .....
Qt Creator Designer插件的 例子:
头文件中定义了一个minValue 的属性,如下:
class BarRuler : public QWidget
{
Q_OBJECT
Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
public:
explicit BarRuler(QWidget *parent = 0);
~BarRuler();
private:
double minValue;
public:
double getMinValue() const;
public slots:
void setRange(double minValue, double maxValue);
};
cpp文件实现如下:
#include "barruler.h"
BarRuler::BarRuler(QWidget *parent) : QWidget(parent)
{
minValue = 0;
}
BarRuler::~BarRuler()
{
}
double BarRuler::getMinValue() const
{
return this->minValue;
}
void BarRuler::setMinValue(double minValue)
{
this->minValue = minValue;
update();
}
在设计模式界面调用如下:
1、先拖入一个widget控件
2、在其上右键选择“提升为”BarRuler
3、点击属性栏的加号,选择其它类型,如图
4、类型和名称都要和头文件里定义的相同,如图
5、在属性栏就会出现对应的动态属性,如图
6、修改数值,就会改变相对应定义的属性了
https://blog.csdn.net/wzs250969969/article/details/78418124