当前位置:网站首页>QT笔记——Q_PROPERTY了解
QT笔记——Q_PROPERTY了解
2022-08-02 10:59:00 【旧街凉风°】
我们会经常看到有人使用 这个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设计师,我们手动去给一个添加一个动态属性

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)
边栏推荐
猜你喜欢

Com多进程通信实现
开箱即用-使用异步加载布局来优化页面启动速度的几种方案

10份重磅报告 — 展望中国数字经济未来

3年测试在职,月薪还不足2w,最近被裁员,用亲身经历给大家提个醒...

外包学生管理系统架构文档

org.apache.ibatis.binding.BindingException Invalidbound statement (not found)的解决方案和造成原因分析(超详细)

Multithreading (Basic) - 40,000 word summary

C#/VB.NET 添加多行多列图片水印到Word文档
![ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法](/img/57/821576ac28abc8d1c0d65df6a72fa3.png)
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法

Nanny Level Tutorial: Write Your Own Mobile Apps and Mini Programs (Part 2)
随机推荐
行为型模式-模板方法模式
小几届的学弟问我,软件测试岗是选11k的华为还是20k的小公司,我直呼受不了,太凡尔赛了~
21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...
wireshark的安装教程(暖气片安装方法图解)
有奖征集|TaoCloud&宝德联合举办全闪POC!
行为型模式-策略模式
如何在技术上来保证LED显示屏质量?
LeetCode每日一练 —— 225. 用队列实现栈
只问耕耘,不问收获,其实收获却在耕耘中
Rear tube implements breadcrumb function
微信小程序---组件开发与使用
TimerTask(addin timer语音)
21 Days Learning Challenge - Day 1 Punch (Screen Density)
C#/VB.NET to add more lines more columns image watermark into the Word document
ssm网页访问数据库数据报错
Oracle 19c 连接PDB
Mysql环境变量的配置(详细图解)
神通数据库,批量插入数据的时候失败
LayaBox---TypeScript---迭代器和生成器
3 d laser slam: LeGO - LOAM - ground point extracting method and the analysis of the code