zoukankan      html  css  js  c++  java
  • Qt之Q_PROPERTY宏理解

    在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义:

    Qt中的Q_PROPERTY宏在Qt中是很常用的,那么它有什么作用呢?  

    Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。

    如何理解“属性系统”这个概念?

    一般我们说一个类有什么属性,指的就是这个类有啥成员变量。比如 People 类中有个 int age 的私有成员变量,我们就可以说这个 People 类有个“年龄”属性可以更改读取。

    Qt 提供的这个属性系统,作用就是把类的信息暴露出来成为通用的大家都认识的信息。比如用 C++ 语言写的People 类中有个 int age 变量,但是如果用 QML 语言去读取就会出问题,因为 QML 有自己的规则,它不认识 C++ 啊。怎么办呢?用 Qt 的属性系统就可以解决这个问题。属性系统可以这样理解:当一个类的成员变量或者成员函数用属性系统处理一下,它们就从 C++ 内部中暴露出来,而且大家都认得。

    属性系统是专门为元对象系统服务的。

    Q_PROPERTY(type name
            READ getFunction
            [WRITE setFunction]
            [RESET resetFunction]
            [NOTIFY notifySignal]
            [DESIGNABLE bool]
            [SCRIPTABLE bool]
            [STORED bool]
            [USER bool]
            [CONSTANT]
            [FINAL])

     

    之前一直在使用VS开发C++程序,接触过开发Ocx控件会有控件属性设置,Qt这里的属性系统可以和之前的知识联系起来,Qt的属性功能使得我们可以选择访问数据成员的方式,属性就像是类的数据成员,但是在元对象系统中,它的其他特性是到处可见的(相比较于类成员的一般情况下私有化)

     

    我们使用这个宏的时候,注意两个问题:

    1)类型,属性名和READ(读)方法是必须的。也就是前三个参数可必须有的。类型可以是QVariant支持的任一类型,又或者是我们自定义的类型,其他是可选的。下面的title属性定义可以这么来说明:定义一个属性title,类型是QString,读title的方法是title()函数,写title的方法是setTitle,这里USER表示是否用户自定义类型,这里应该设置为false。

     

    2)属性声明完了以后,我们还需要进行读写函数的声明和定义

     

    为什么要使用它呢?在哪里使用它呢?

    答:Qt中类的属性是给脚本和元对象系统用的,比如QtScript,QML,或者QObject::property/setProperty……,主要就是用来进行属性封装,在具体的脚本,库,qml开发中必须使用。

     

    最常见的是在QML中访问C++,通过C++类暴露属性来使用,接上面实例如下:

    1、新建Qt Quick工程:qt PROPERTY

    2、新建C++类TestProperty,公有继承于QObject

    3、为TestProperty类设置上述属性title

    Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged);

    4、属性读写函数声明与实现

    class TestProperty : public QObject

    {

         Q_OBJECT

    public:

        explicit TestProperty(QObject *parent = nullptr);

        Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged);

     

        QString title();

        void setTitle(QString strTitle);

    signals:

        void titleChanged();

     

    public slots:

     

    private:

        QString     m_title;

    };

     QString TestProperty::title()

    {

        return  m_title;

    }

     

    void TestProperty::setTitle(QString strTitle)

    {

        m_title = strTitle;

        emit titleChanged();

    }

    5、在main函数中注册这个类,导出到qml中

    #include <qglobal.h>

    #include "TestProperty.h"

                             

    qmlRegisterType<TestProperty>("TestProperty", 1, 0, "TestProperty");

     

    6、在qml中调用title属性

    import QtQuick 2.9
    import QtQuick.Window 2.2
    import TestProperty 1.0 
    Window {
        visible: true
         640
        height: 480
        title: qsTr("Hello Qt")
     
        TestProperty{
            id: testProperty
            title: qsTr("Hello World")
        }
     
        Component.onCompleted: {
            title = testProperty.title;
        }
    }

    运行后:

     

  • 相关阅读:
    使用 Spring 2.5 注释驱动的 IoC 功能
    分页、排序SQL 通用存储过程(转)
    MySQL中group_concat函数
    文本内容分页
    jQuery Pagination Ajax分页插件中文详解(转)
    Cesium组件:Cesiumdraw,基于Vue开发的Cesium基础标绘插件
    tileset格式详解Part2
    css实现div的隐藏
    eltable不透明度&边框
    1rem,1em,1vh,1px含义
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11038273.html
Copyright © 2011-2022 走看看