Qml 之Q_PROPERTY 误区

2024-06-20 07:48
文章标签 property qml 误区

本文主要是介绍Qml 之Q_PROPERTY 误区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Q_PROPERTY介绍:

Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙。

Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。
Q_PROPERTY(type nameREAD getFunction[WRITE setFunction][RESET resetFunction][NOTIFY notifySignal][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])

下面是一些典型的声明属性的示例:

Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(bool animation READ getAnimation WRITE setAnimation)
Q_PROPERTY(QColor barColor READ getBarColor WRITE setBarColor)

一个属性的行为就像类的数据成员,但是它还具有附加的特性,这些特性可以被元数据对象系统操作。
这些特性是:

需要一个READ访问器函数。

用于读属性的值。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。例如,QWidget::focus是一个只读的属性,它对应一个读函数:QWidget::hasFocus()。

一个可选的WRITE访问器函数。

它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。

一个可选的RESET函数。

用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。

一个可选的NOTIFY信号。

如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。


理解误区:

c++ 示例代码

Q_PROPERTY(bool mypro READ readMyPro WRITE setMyPro NOTIFY myproChanged)
其中bool mypro 只是声明,跟实际类中声明的变量没有关系,该声明可在qml文件中直接访问,类中变量只跟readMyPro、setMyPro中操作的类成员变量有关系。比如下面的Q_PROPERTY(bool mypro …) ,但是实际类中声明的成员变量是 bool btest;

#include <QObject>
#include <QDebug>
class MyProperty : public QObject
{Q_OBJECTQ_PROPERTY(bool mypro READ readMyPro WRITE setMyPro NOTIFY myproChanged)
public:explicit MyProperty(QObject *parent = nullptr);bool readMyPro(){return btest;}void setMyPro(bool b){btest = b;emit myproChanged();qDebug() << "mypro changed";}
signals:void myproChanged();
private:bool  btest = false;
};

qml 内容:

import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Controls 2.12
Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Button{text: "change"x:50y:50width: 200height: 90onClicked:{mypro.mypro = true;var b = mypro.myproconsole.log(b);}}
}

在qml文件中可以直接访问c++中Q_PROPERTY声明的属性如 mypro.mypro; 并且修改该属性,会自动调用setMyPro函数;


打印如下:
在这里插入图片描述

总结:

Q_PROPERTY(type name READ getFunction WRITE setFunction NOTIFY notifySignal )
getFunction 、setFunction 、notifySignal都是本来已经存在的东西也就是说是你自己在类里边定义的东西,Q_PROPERTY只是将他们注册到元对象系统中,并且起了个名字叫name,使之能够使用元对象系统操作name,包括在designer中,qml中,都可以直接用name这个属性,但是在C++中的读写只能使用get/set了

这篇关于Qml 之Q_PROPERTY 误区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077532

相关文章

qml states 状态

states 状态 在QML中,states用于定义对象在不同状态下的属性变化。每个状态可以包含一组属性设置,当状态改变时,这些属性设置会被应用到对象上。 import QtQuick 2.15import QtQuick.Controls 2.15// 定义应用程序的主窗口ApplicationWindow {visible: true // 使窗口可见width: 640 /

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

QML入门之基本元素

元素分为可视元素与非可视元素,可能元素例如Rectangle、Button等。非可视元素如Timer(定时器)、MouseArea(鼠标区域)等。非可视元素一般用于操作可视元素。 基础元素 Item Item(基础元素对象)是所有可视元素的基础对象,它们都继承自Item。可是元素存在以下共有属性。 Group(分组)Properties(属性)Geometry(几何属性)x

Cannot read property ‘length‘ of null while opening vscode terminal

同一问题地址:Cannot read property ‘length’ of null while opening vscode terminal 问题描述 One day, 我在ubuntu 18.04下用vscode打开一个项目,并想和往常一样在vscode使用终端,发现报错Cannot read property 'length' of null。 解决 打开setting.jso

Android 属性动画(Property Animation)

本文是学习以下三位大神之后,整理的学习笔记,彩蛋在编号6          http://blog.csdn.net/lmj623565791/article/details/38067475          http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html          http://www.tu

Android Property Animation属性动画

本文内容摘自《疯狂Android讲义 第三版-李刚著作》

【python】 @property属性详解

【python】 @property属性详解 一文搞懂python中常用的装饰器(@classmethod、@property、@staticmethod、@abstractmethod…)

uniapp微信小程序开发踩坑日记:Pinia持久化报错Cannot read property ‘localStorage‘ of undefined

插件默认使用 localStorage 实现持久化,小程序端不兼容,需要替换持久化 API import { defineStore } from 'pinia'   export const useCommonStore = defineStore('pack-store', {state: (): State => ({wwInfo: {},globalData: {},timerLoc

property 的成员属性

1、assign 范围:对基础数据类型(NSInteger 和 CGFloat) 和 C数据类型(int、float) 使用:简单赋值,不更改索引计数 2、copy(内容拷贝) 范围:对NSString、NSNumber 使用:拷贝对象,释放旧对象,开辟新的内存空间,并将索引计数设为1 深复制:copy的set方法,就是深复制 3、retain(指针拷贝) 范围:对其他NSObje

【Qml】QML QQuickImage: Cannot open

环境: Cmake + Qt6 + Qml 问题: 在学习Qml的时候,使用到Image元素。用Image展示图片的时候,图片放在qrc资源文件中。但是运行程序,显示QML QQuickImage: Cannot open:导致图片无法正常显示。 如下: 解决方法: 在CMakeLists.txt文件中添加set(CMAKE_AUTORCC ON)这句即可。启用了 CMake 自动