在初学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
    width: 640
    height: 480
    title: qsTr("Hello Qt")
 
    TestProperty{
        id: testProperty
        title: qsTr("Hello World")
    }
 
    Component.onCompleted: {
        title = testProperty.title;
    }
}

运行后:

Qt之Q_PROPERTY宏理解的更多相关文章

  1. QT之Qt之Q_PROPERTY宏理解

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

  2. Qt 浅析Q_PROPERTY宏

    最近在使用QProperAnimation画类,研究这个的时候看到别人写的代码有用到 Q_PROPERTY()这个宏,然后查了下,这个宏只有Qt才有的 并且需要进行编译,继承于QOBJECT Qt 手 ...

  3. Qt中的Q_PROPERTY宏浅析

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

  4. C++在使用Qt中SLOT宏须要注意的一个小细节

    大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是 ...

  5. C++在使用Qt中SLOT宏需要注意的一个小细节

    大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类如果覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但如果指针去调用非虚函数,这个时候会调用C++的静态绑定,去判断当前的指针是 ...

  6. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

  7. Qt信号槽机制理解

    1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...

  8. Qt坐标转换系统的理解

    转 https://blog.csdn.net/hgcprg/article/details/53537106 今天又看了一篇对Qt坐标转换系统以及QTransform的博客,作者讲的非常透彻,链接如 ...

  9. QT虚拟小键盘设计--qt事件循环,事件发送的理解

    有人讲到QT5.7及其以后的版本才自带免费的小键盘插件. QT5.10中关于QKeyEvent类:点击打开链接 QT sendEvent和PostEvent, 点击打开链接 my god,我今天安装了 ...

随机推荐

  1. 201871010107-公海瑜《面向对象程序设计(java)》第十六周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第十六周学习总结            项目                            内容   这个作业属于哪 ...

  2. centos用手机号无法登入安全狗的解决方法

    前面我们安装好了安全狗,需要加服务器加入服云中,通常用sdcloud –u 用户名就可以,但如果是手机号的话就可能无法登陆,我们用sdcloud -h命令查看帮助,如下图所示 我们看到输入账号可以用- ...

  3. Linux作为l2tp client 连接l2tp server

    cat /etc/xl2tpd/xl2tpd.conf [global] debug tunnel = yes [lac name] lns = xxx.xxx.xxx.xxx pppoptfile ...

  4. postgres 字符操作补位,字符切割

    补位: ,'); -- 字符切割 并取值: )

  5. 使用mytop监控mysql

    mytop 是一个不错的实时查看mysql 状态的命令行工具,使用简单 安装 yum install -y mytop 环境准备 docker-compose 创建服务 version: " ...

  6. SQL Server 创建数据库

    创建数据库有两种方式: 方式1-图形化界面创建: 1. 鼠标右击“数据库”,然后点击新建数据库 2.设置常规选项卡 2.1 给数据库命名,一般多个单词要用下划线连接,不建议用空格,如Test_DB. ...

  7. 11/4 <LinkedList>

    82. Remove Duplicates from Sorted List II 跳过重复节点,返回head. class Solution { public ListNode deleteDupl ...

  8. 基于DFA算法、RegExp对象和vee-validate实现前端敏感词过滤

    面临敏感词过滤的问题,最简单的方案就是对要检测的文本,遍历所有敏感词,逐个检测输入的文本是否包含指定的敏感词. 很明显上面这种实现方法的检测时间会随着敏感词库数量的增加而线性增加.系统会因此面临性能和 ...

  9. Linux性能优化实战学习笔记:第四十九讲

    一.上节回顾 上一期,我们一起梳理了,网络时不时丢包的分析定位和优化方法.先简单回顾一下.网络丢包,通常会带来严重的性能下降,特别是对 TCP 来说,丢包通常意味着网络拥塞和重传,进而会导致网络延迟增 ...

  10. MySQL实战45讲学习笔记:第二十讲

    一.引子 在上一篇文章最后,我给你留了一个关于加锁规则的问题.今天,我们就从这个问题说起吧. 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表.建表和初始化语句如下(为了便于本期的例子说明, ...