我们会经常看到有人使用 这个Q_PROPERTY,在下我们来了解一下它是干什么的

READ:用于读取属性值,如果未指定成员变量(通过MEMBER ),则需要读取访问器函数。

WRITE:写访问器函数是可选的。用于设置属性值。它必须返回void,并且必须只接受一个参数,要么是属性的类型,要么是指向该类型的指针或引用。

MEMBER:如果未指定读取访问器函数,则需要成员变量关联。这使得给定的成员变量可读写,而无需创建读写访问器函数。如果需要控制变量访问,除了成员变量关联(但不是两者)之外,还可以使用读或写访问器函数。

RESET:复位功能是可选的。它用于将属性设置回其特定于上下文的默认值。

NOTIFY:通知信号是可选的。如果已定义,它应该指定该类中的一个现有信号,该信号在属性值更改时发出。成员变量的通知信号必须采用零个或一个参数,这些参数必须与属性的类型相同。参数将采用属性的新值。仅当属性确实发生更改时才应发出NOTIFY信号,以避免绑定在QML中被不必要地重新计算。

REVISION:修订号是可选的。如果包含,它将定义属性及其通知程序信号,以便在特定版本的API中使用(通常用于暴露于QML)。如果不包含,则默认为0。

DESIGNABLE:表示属性是否应该在GUI设计工具(例如Qt
Designer)的属性编辑器中可见。大多数属性是可设计的(默认为true)。可以指定布尔成员函数,而不是true或false。

SCRIPTABLE:表示脚本引擎是否应该访问此属性(默认为true)。可以指定布尔成员函数,而不是true或false。

STORED:表示属性是应该被认为是独立存在还是依赖于其他值。它还指示在存储对象状态时是否必须保存属性值。

USER:表示是将属性指定为类的面向用户属性还是用户可编辑属性。通常,每个类只有一个用户属性(默认值为false)。

CONSTANT:表示属性值是常量。对于给定的对象实例,常量属性的READ方法每次调用时必须返回相同的值。对于对象的不同实例,此常量值可能不同。常量属性不能有写入方法或通知信号。

FINAL:表示派生类不会重写该属性。在某些情况下,这可以用于性能优化,但不是由moc强制执行的

使用这个宏的前提是 必须 要有 Q_OBJECT这个宏
使用这个宏 就相当于 给这个对象添加了 一个属性,这个属性 可以通过READ 读访问器 去读取数据
WRITE 写访问器 去写数据 NOTIFY 属性改变时 发出 信号

第一种:ui设计创建
打开我们的 QDesigner设计师,我们手动去给一个添加一个动态属性

第二种:代码创建

     Q_OBJECTQ_PROPERTY(QString okText READ getOkText WRITE setOkText NOTIFY stringChange)
public:Q_INVOKABLE void setOkText(QString name);Q_INVOKABLE QString getOkText() const ;
private:Ui::QMetaObjectTestClass ui;QString m_okText;
void QMetaObjectTest::setOkText(QString okText)
{m_okText = okText;emit stringChange(okText);}QString QMetaObjectTest::getOkText() const
{return m_okText;
}
#include "QMetaObjectTest.h"
#include <QtWidgets/QApplication>
#include <QWidget>int main(int argc, char *argv[])
{QApplication a(argc, argv);QMetaObjectTest    test;//ui设计师 设置的动态属性 qDebug() << QStringLiteral("我是widget的WidgetName动态属性:") << test.property("WidgetName").toString();QList<QPushButton*> btns = test.findChildren<QPushButton*>();for (auto& btn : btns){if (btn->objectName() == "pushButton_ok"){qDebug() << QStringLiteral("我是btn的okText动态属性:") << btn->property("okText").toString();qDebug() << QStringLiteral("我是btn的isShow动态属性:") << btn->property("isShow").toBool();}}//手动添加 动态属性 test.setProperty("okText", "123");qDebug()<< test.property("okText").toString();return a.exec();
}

运行效果图:

说明:

以下两段代码起到的效果是完全一样的,不管你加不加,这个信号都需要你自己 emit :
Q_PROPERTY(QString okText READ getOkText WRITE setOkText NOTIFY stringChange)        maskChanged
Q_PROPERTY(QString okText READ getOkText WRITE setOkText)      

如果想要信号自动触发:

使用 MEMBER 注册后,当 m_okText 发生改变,将会发出 stringChange信号
MEMBER含义为:如果一个属性不需要 READ ,但又想使用属性系统,可以使用MEMBER来注册,MEMBER后面是成员变量的名字;

Q_PROPERTY(QString okText MEMBER m_okText NOTIFY stringChange)

参考博客:
Q_PROPERTY 讲解
Q_PROPERTY 了解

QT笔记——Q_PROPERTY了解相关推荐

  1. 05黑马QT笔记之自定义槽函数

    05黑马QT笔记之自定义槽函数 1 自定义槽函数其实不难,没什么好说的,注意以下几点便可. 自定义参函数注意事项(Qt5): * 1)自定义槽函数可以是类成员函数(用得最多).全局普通函数.静态函数. ...

  2. 02黑马QT笔记之完全手写Hello World

    02黑马QT笔记之完全手写Hello World 1 步骤: 1 新建项目. 2 选择其他项目->空项目. 3 在空项目中添加QT +=widgets //代表使用窗口基类. 4 右击项目名字- ...

  3. Qt笔记(三十七)之解决QWebSocket收发中文乱码问题

    一.前言 之前介绍了基于QWebSocket实现的的服务端和客户端: Qt笔记(三十五)之QWebSocket简单使用(1)-实现服务端 Qt笔记(三十六)之QWebSocket简单使用(2)-实现客 ...

  4. QT笔记第0篇__Qt基本介绍

    QT笔记第0篇__Qt基本介绍 一.引言 二.Qt简介 三.特点: 四.相关网址 五.参考资料 一.引言 由于算法的实现过程中常常需要制作一些demo来进行功能展示,最开始打算用mfc,于是看了一段几 ...

  5. Qt笔记(五十四)之Activate控件开发

    一.Activate控件简介(内容摘自自百度) ActiveX控件是Microsoft的ActiveX技术的一部分.ActiveX控件是可以在应用程序和网络中计算机上重复使用的程序对象.创建它的主要技 ...

  6. Qt文档阅读笔记-Q_PROPERTY解析及实例

    目录 官方解析 博主栗子 官方解析 这个宏用于继承于QObject的类声明属性.这样声明后的属性行为与类数据成员一样,但是他们可以通过元对象系统进行访问. Q_PROPERTY(type name(R ...

  7. 【Qt】Q_PROPERTY():属性系统

    一.简介 Qt属性系统基于元对象Meta-Object系统,因此在使用时,需要继承QObject类并添加宏Q_OBJECT,属性除了具有类成员的功能外,还可以通过元对象系统访问,比如可以使用信号和槽机 ...

  8. Qt笔记-QTcpSocket跨线程调用(官方推荐方法,非百度烂大街方法)

    TCP服务端的经典案例中有个例子,就是当收到TCP客户端连接后,线程池直接开一个线程然后把这个socket指针传到线程里面,依靠新开的线程进程业务处理. 但在Qt里面使用这个方式后,会报一个QTcpS ...

  9. Android|Qt笔记-某App注册机思路总结

    现在是2021-08-01 23:20:44,目前这篇博文还在笔记里面,估计发布到网上已经是1个月后了. 目前写了一个App的注册机: 这里是单线程的,差不多30-50s可以注册一个帐号. 这个程序不 ...

最新文章

  1. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
  2. 在开源模式下云计算大数据的现状浅析
  3. PyTorch 可视化特征
  4. QT的QMessageAuthenticationCode类的使用
  5. 中石油训练赛 - Perfect Tree(dfs)
  6. javascript中的内存管理
  7. input type=file 实现上传、预览、删除等功能
  8. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
  9. qq音乐2012绿色版
  10. c语言的四个函数,C语言学习之动态内存分配的四个函数
  11. js 自动分配金额_(2.4w字,建议收藏)??原生JS灵魂之问(下), 冲刺??进阶最后一公里(附个人成长经验分享)
  12. 现在学SEO还有用吗;还能用到SEO吗;
  13. 最长不下降子序列//序列dp
  14. linux编译trinitycore,TC编译步骤之二代码安装
  15. 80 多个免费编程字体,你喜欢哪种?
  16. Android Studio中新建assets文件的两种方法
  17. linux分屏桌面环境,Linux分屏操作screen[装逼神器]
  18. HTTP协议详解你确定不看吗
  19. Python—实现语音自动播报最新疫情信息
  20. Uniapp自定义相机界面

热门文章

  1. SSM整合开发办公系统核心模块五(报销单处理)
  2. 黑客可入侵自动洗车系统暴力攻击驾驶人
  3. [区块链安全-Ethernaut]区块链智能合约安全实战-已完结
  4. java label对齐方式_java – 在BorderLayout中对齐JLabel和JTextField
  5. 多年经验的程序员迷失了自己,该怎么办
  6. 深天马A:持股5%以上股东计划减持不超过4096万股公司股份
  7. 解读下一代网络:算力网络正从理想照进现实
  8. 邮件接收中Postfix、Dovecot、Squirrelmail、MySQL、AMaVis、Clam AntiVirus和SpamAssasin的功能解析
  9. 实践数据湖iceberg 第九课 合并小文件
  10. 【回忆 总结】我的大学四年