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

Qt中的Q_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])

之前一直在使用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、属性读写函数声明与实现

TestProperty.h 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
#ifndef TESTPROPERTY_H
#define TESTPROPERTY_H

#include <QObject>

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;

};

#endif // TESTPROPERTY_H

TestProperty.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#include "TestProperty.h"

TestProperty::TestProperty(QObject *parent) : QObject(parent)
{

}

QString TestProperty::title()
{
    return  m_title;
}

void TestProperty::setTitle(QString strTitle)
{
    m_title = strTitle;
    emit titleChanged();
}

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

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <qglobal.h>
#include "TestProperty.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

qmlRegisterType<TestProperty>("TestProperty", 1, 0, "TestProperty");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

return app.exec();
}

6、在qml中调用title属性

main.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
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;
    }
}

运行后:

转载于:https://www.cnblogs.com/MakeView660/p/10813829.html

QT之Qt之Q_PROPERTY宏理解相关推荐

  1. Qt属性系统及Q_PROPERTY宏的使用

    0.前言 像某些编译器提供的平台特有的属性系统(Property System)一样,Qt也提供了一个复杂的属性系统.当然,作为一个跨平台框架,Qt没有依赖那些非标准的编译器特性,比如:__prope ...

  2. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)

    #Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分) 在pro文件中添加: #仅在linux 系统下, 硬件平台无关的内容 unix{HEADERS += \ ...

  3. Qt获取时间、日期宏定义

    Qt获取时间.日期宏定义 #define QDATE qPrintable(QDate::currentDate().toString("yyyy-MM-dd")) #define ...

  4. 【Qt】Qt学习笔记(更新中)

    文章目录 0x00 前言 0x01 Qt简介 1.1 Qt是什么 1.2 Qt发展史 1.3 Qt支持的平台 1.4 使用Qt开发的软件 1.5 Qt的优点 1.6 其它 0x02 创建Qt项目 2. ...

  5. 【Qt】Qt样式表总结(三):QObject 属性

    [Qt]Qt样式表总结(一):选择器 [Qt]Qt样式表总结(二):冲突和命名空间 QObject 属性 可以使用 qproperty < 属性名称 > 语法,设置任何可以Q_PROPER ...

  6. 【Qt】Qt数据库简介

    00. 目录 文章目录 00. 目录 01. Qt SQL模块简介 02. 数据库类 03. 数据库驱动 04. 测试代码 05. 附录 01. Qt SQL模块简介 本概述假定您至少具有SQL的基本 ...

  7. 关于Qt、Qt/E、Qtopia、qvfb、framebuffer、qpe等概念的对比介绍

    最近要在嵌入式linux平台下搞UI界面开发,经过一番挑选,决定使用Qt作为UI开发平台.不过Qt中所涉及的Qt/E.Qtopia.qvfb.framebuffer.qpe等众多概念,却有点剪不断理还 ...

  8. 【QT】QT从零入门教程(七):图像适应窗口

      在第5节里,我们讲解了初始化图像框QLabel的方法,用于显示图像.在第6节里,运用QDockWidget实现了基本窗口布局.在显示图像时,如果打开比QLabel大的图像,会自动出现滚动条.这样能 ...

  9. Qt 与 Qt Creator 简介

    该文章原创于Qter开源社区(www.qter.org),作者 yafeilinux,转载请注明出处! 一.Qt 与 Qt Creator 简介 Qt 是一个跨平台应用程序和 UI 开发框架.使用 Q ...

最新文章

  1. Windows消息队列
  2. C语言中do...while(0)用法小结
  3. php strrchar,php文件上传
  4. 打造最美HTML5 3D机房(MONO哥强势归来,第四季惊艳发布)
  5. Linux信号列表(非实时信号和实时信号)
  6. RequireJS 主入口加载模块经常会加载失败的问题
  7. Java学习小程序(4)数列求和
  8. IP地址和子网划分学习笔记之《预备知识:进制计数》
  9. 教你如何用双SATA硬盘组建RAID系统
  10. 实战ReactNative 从入门到精通 重要技术解析,5分钟搭建iOS, Android App 实战一
  11. 2017OKR年终回顾与2018OKR初步规划
  12. MySQL数据库通过data文件夹恢复数据库信息
  13. 阿米巴经营之软件经营-写得不错留作记念
  14. Oracle-----同义词索引
  15. 【实战技能】Google I/O 2022大会AI/ML给开发者的启发
  16. 计算机毕业设计之java+javaweb的电动车实名制挂牌管理系统
  17. nginx中deny和allow详解
  18. MFC链表CList类
  19. [Word]:Microsoft word中插入代码 PlanetB, 批量上标
  20. 开启xmp1还是2_2020年11月2日大盘走势总结

热门文章

  1. sublimText3在ubuntu下的中文支持
  2. jQuery框架学习第十天:实战jQueryUI常用功能
  3. 深度学习《CycleGAN》
  4. jdbc关于操作Oracle时间数据解析
  5. 数学基础 —— 线性代数
  6. leetcode - 375. 猜数字大小 II
  7. 使用deeplearning4j训练Doc2Vec(文档向量)
  8. VC++开发演算稿式计算语言-可编程绘图的计算器
  9. Opencv 中cv开头的函数和没有cv的区别,例如cvWaitkey()和waitKey()的区别
  10. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(2)--(P3P)