本文主要是介绍Qml 之Q_PROPERTY 误区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Q_PROPERTY介绍:
Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙。
Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。
Q_PROPERTY(type nameREAD 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访问器函数。
用于读属性的值。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。例如,QWidget::focus是一个只读的属性,它对应一个读函数:QWidget::hasFocus()。
一个可选的WRITE访问器函数。
它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。
一个可选的RESET函数。
用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。
一个可选的NOTIFY信号。
如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。
理解误区:
c++ 示例代码Q_PROPERTY(bool mypro READ readMyPro WRITE setMyPro NOTIFY myproChanged)
其中bool mypro 只是声明,跟实际类中声明的变量没有关系,该声明可在qml文件中直接访问,类中变量只跟readMyPro、setMyPro中操作的类成员变量有关系。比如下面的Q_PROPERTY(bool mypro …) ,但是实际类中声明的成员变量是 bool btest;
#include <QObject>
#include <QDebug>
class MyProperty : public QObject
{Q_OBJECTQ_PROPERTY(bool mypro READ readMyPro WRITE setMyPro NOTIFY myproChanged)
public:explicit MyProperty(QObject *parent = nullptr);bool readMyPro(){return btest;}void setMyPro(bool b){btest = b;emit myproChanged();qDebug() << "mypro changed";}
signals:void myproChanged();
private:bool btest = false;
};
qml 内容:
import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Controls 2.12
Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Button{text: "change"x:50y:50width: 200height: 90onClicked:{mypro.mypro = true;var b = mypro.myproconsole.log(b);}}
}
在qml文件中可以直接访问c++中Q_PROPERTY声明的属性如 mypro.mypro; 并且修改该属性,会自动调用setMyPro函数;
打印如下:
总结:
Q_PROPERTY(type name READ getFunction WRITE setFunction NOTIFY notifySignal )
getFunction 、setFunction 、notifySignal都是本来已经存在的东西也就是说是你自己在类里边定义的东西,Q_PROPERTY只是将他们注册到元对象系统中,并且起了个名字叫name,使之能够使用元对象系统操作name,包括在designer中,qml中,都可以直接用name这个属性,但是在C++中的读写只能使用get/set了
这篇关于Qml 之Q_PROPERTY 误区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!