Qml 之Q_PROPERTY 误区

Q_PROPERTY介绍:

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访问器函数。

用于读属性的值。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。例如,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_OBJECT
    Q_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: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button
    {
        text: "change"
        x:50
        y:50
        width: 200
        height: 90

        onClicked:
        {
            mypro.mypro = true;
            var b = mypro.mypro
            console.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了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值