QT中QML学习笔记2

devtools/2024/11/7 17:24:47/
  1. 默认属性:对象定义可以具有单个default属性,指在另一个对象的定义中声明某个对象而未将其声明为特定属性的值时为其赋值的属性。
    使用optional关键字声明属性可将其标记为默认属性。例如:
// MyLabel.qml
import QtQuick
Text {default property var someText	//someText具有默认属性text: `Hello, ${someText.text}`
}
//该值可在对象定义中赋值
MyLabel{Text{text:"world!"}}//等价于
MyLabel{someText:Text{text:"world!"}}
  1. 必需属性:对象声明可以使用关键字根据需要定义属性。语法为required:
    required property
    以下自定义Rectangle组件,始终需要指定color属性:
Rectangle {required color
}
//注意:不能从QML为required属性分配初始值,因为会直接违背其属性的预期用途
  1. 只读属性:对象声明可以使用关键字定义只读属性,语法如下:readonly
    readonly property :
    注意:初始化时,必须为只读属性分配静态值或绑定表法式。初始化只读属性后将无法更改其静态值或绑定表达式。
    Property Modifier 对象:属性可具有与之关联的属性值修饰符对象。声明与特定属性关联的属性修饰符类型实例语法如下:
    on {
    // attributes of the object instance
    }
  2. 信号属性:信号是来自对象的通知,表明发生了某些事件:如属性更改,动画已启动或停止,下载图像等 当发出特定信号时,可以通过signal
    handler通知对象。信号处理程序使用语法on声明,其中是信号的名称,第一个字母大写。必须在发出信号的对象定义中声明信号处理程序且处理程序应包含调用信号处理程序时要执行的javascript代码块
    例如:onClicked信号处理程序在对象定义中声明并在单击时调用,打印控制台信息:
import QtQuick
Item {width: 100; height: 100MouseArea {anchors.fill: parentonClicked: {console.log("Click!")}//点击鼠标控制台输出信息}
}
  1. 定义信号属性:可通过注册类为C++中的类型定义信号,然后向QML类型系统注册;或可使用以下语法在QML文档的对象声明中定义对象类型的自定义信号:
    signal [([: [, …]])]
//信号声明
import QtQuick
Item {signal clicked//信号无参数可不使用()signal hovered()signal actionPerformed(action: string, actionResult: int)
}
  1. 信号处理程序属性:信号处理程序是一种特殊的方法属性,每当发出相关信号时,QML引擎会调用方法实现,默认情况下该对象定义具有空实现。客户端可提供implementation以实现程序逻辑:
//考虑以下类型,其定义在文件中提供,如下所示,其中包含 signals 和 :SquareButtonSquareButton.qmlactivateddeactivated
// SquareButton.qml
Rectangle {id: rootsignal activated(xPosition: real, yPosition: real)signal deactivatedproperty int side: 100width: side; height: sideMouseArea {anchors.fill: parentonReleased: root.deactivated()onPressed: mouse => root.activated(mouse.x, mouse.y)}
}
//信号处理程序的实现:SquareButton
// myapplication.qml
SquareButton {onDeactivated: console.log("Deactivated!")onActivated: (xPosition, yPosition) => {console.log(`Activated at ${xPosition}, ${yPosition}`)}
}
  1. 属性更改信号处理程序:采用语法形式onChanged,编写一个信号处理程序以便此属性更改时调用:textChangedonTextChanged
import QtQuick
TextInput {text: "Change this!"onTextChanged: console.log(`Text has changed to: ${text}`)
}

8.函数属性:对象类型的方法是可以调用以执行某些处理或触发更多事件的函数。方法可以连接到信号,以便在发出信号时自动调用该方法。
9.定义函数属性:通过标记一个类的函数来为一个类型定义一个方法,该函数随后被注册到QML类型系统中,或者将其注册为该类的一个;也可使用以下语法将自定义方法添加到QML文档中的对象声明中:
function ([[: ][, …]]) [: ] { }
注意:与signal不同,方法参数类型不必声明因为它们默认为该类型,但应该声明以帮助生成性能更高的代码并提高可维护性
10. 在分配值时调用的方法:calculateHeight()height

import QtQuick
Rectangle {id: rectfunction calculateHeight(): real {return rect.width / 2;}//无参函数width: 100height: calculateHeight()
}

11.如果函数有参数则可以在方法中按名称访问这些参数:

import QtQuickItem {width: 200; height: 200MouseArea {anchors.fill: parentonClicked: mouse => label.moveTo(mouse.x, mouse.y)}//点击时唤醒函数可重定位至此text中moveto的新的newX和newYText {id: labelfunction moveTo(newX: real, newY: real) {label.x = newX;label.y = newY;}text: "Move me!"}
}

12.附加属性和附加信号处理程序:使对象能够使用额外的属性或信号处理程序进行注释,引用语法:
.
.on
例如:

//该类型具有一个附加属性,可用于每个单独的代理对象都可使用其来确定是否时视图中的当前选定项
import QtQuick
ListView {width: 240; height: 320model: 3delegate: Rectangle {width: 100; height: 30color: ListView.isCurrentItem ? "red" : "yellow"//附加属性}
}
import QtQuickListView {width: 240; height: 320model: ListModel {id: listModelComponent.onCompleted: {for (let i = 0; i < 10; i++) {append({ Name: `Item ${i}` })}}//附加的信号处理程序:Component.onCompleted}delegate: Text { text: index }
}

假设附加的属性和信号处理程序可以从这些属性已附加到的对象的子对象直接访问时错误的,attaching类型实例仅附加到特定对象而不附加到对象及其所有子对象:

import QtQuick
ListView {width: 240; height: 320model: 3delegate: Item {width: 100; height: 30Rectangle {width: 100; height: 30color: ListView.isCurrentItem ? "red" : "yellow" // 这是错误的,它仅附加到根委托对象而不是子对象}}
}
//-----------------------------------------------------------
ListView {delegate: Item {**id: delegateItem**//特定对象width: 100; height: 30Rectangle {width: 100; height: 30color: delegateItem.ListView.isCurrentItem ? "red" : "yellow" // 这是正确的}}
}

13.枚举属性:枚举提供一组固定的命名选项,可使用enum关键字在QML中声明,枚举类型和值必须以大写字母开头:

// MyText.qml
Text {enum TextType {Normal,Heading}property int textType: MyText.TextType.Normalfont.bold: textType === MyText.TextType.Headingfont.pixelSize: textType === MyText.TextType.Heading ? 24 : 12
}

http://www.ppmy.cn/devtools/132068.html

相关文章

Android——画中画模式

应用中的画中画 监听回到桌面与打开任务列表的广播收到广播之后&#xff0c;调用 enterPictureInPictureMode 方法进入画中画模式重写活动页面的 onPictureInPictureModeChanged 方法&#xff0c;补充进入画中画模式或退出画中画模式时的处理逻辑 回到桌面与切到任务列表 按…

Unity3D PBR美术工作流详解

一、引言 Unity3D中的PBR&#xff08;Physically Based Rendering&#xff0c;基于物理的渲染&#xff09;技术是一种先进的渲染技术&#xff0c;它基于物理光学原理&#xff0c;能够更加真实地模拟物体表面的光照反射和折射效果。掌握PBR的渲染流程对于提升游戏场景的真实感至…

加固筑牢安全防线:多源威胁检测响应在企业网络安全运营中的核心作用

随着网络攻防技术的演进&#xff0c;传统威胁检测技术手段已难以适应快速变化的威胁。多维度协同的攻击手段使得单一的检测技术难以应对复杂的网络安全威胁&#xff0c;企业需要更先进的检测技术来提升安全防护能力。 一、传统威胁检测技术与单一检测的局限性 传统威胁检测技术…

C# 项目中配置并使用 `log4net` 来输出日志

C# 项目中配置并使用 log4net 来输出日志&#xff0c;你需要按照以下步骤进行配置&#xff1a; 步骤 1: 安装 log4net 包 首先&#xff0c;你需要通过 NuGet 包管理器安装 log4net 库。你可以在 Visual Studio 的 NuGet 管理器中搜索 log4net&#xff0c;或者使用以下命令在 …

安装acondana3, Conda command not found

Linux 服务器安装acondana3后 输入conda找不到 写入路径也没找到 vim ~/.bashrc 加入 PATH"root/anaconda3/bin:$PATH" 更新文件&#xff1a; source ~/.bashrc 还是找不到conda 命令 解决办法 source ~/anaconda3/etc/profile.d/conda.sh conda activate Your_e…

使用批处理脚本批量删除Maven无效依赖

背景 在开发过程中&#xff0c;我们经常会遇到以下情况&#xff1a; 在pom.xml文件中错误地指定了依赖的名称。因为网络问题&#xff0c;某些依赖下载不完全。依赖版本号错误&#xff0c;导致下载的文件无法使用。 这些情况会导致Maven在本地仓库中留下一些无效的文件&#…

斑马打印机如何与工业系统(如MES、ERP、数据库等)自动化通讯?

摘要&#xff1a;本文将介绍OPC Router与斑马&#xff08;Zebra&#xff09;打印机相结合的优势&#xff0c;探讨其在工业4.0和物联网领域的应用&#xff0c;以及如何通过简单配置实现数据传输和智能监控。 在工业生产过程中&#xff0c;标签打印环节至关重要。斑马&#xff08…

Nginx 文件名逻辑漏洞(CVE-2013-4547)

影响版本&#xff1a;Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 漏洞原理 这个漏洞其实和代码执行没有太大关系&#xff0c;其主要原因是错误地解析了请求的URI&#xff0c;错误地获取到用户请求的文件名&#xff0c;导致出现权限绕过、代码执行的连带影响。 举个例子&#xff…