QML非可视控件

devtools/2025/2/12 10:57:02/

目录

1.MouseArea

2.Keys

3.Timer

4.Loader

5.Component


1.MouseArea

MouseArea是一个用于处理鼠标事件的不可见组件,通常与可见的项目配合使用,为其提供鼠标交互功能。

属性:

  • enabled:用于设置是否启用鼠标处理,默认为true。
  • acceptedButtons:用于控制具体哪个或哪些鼠标按钮可以触发事件,默认为Qt.LeftButton。可以使用或运算符来指定多个按钮。
  • hoverEnabled:用于决定MouseArea是否接受悬停事件。如果设置为false,悬停事件将不会触发。
  • containsMouse:只读属性,表明当前是否有鼠标光标在MouseArea上。默认情况下,只有鼠标的一个按钮处于按下状态时才可以被检测到。
  • pressed:只读属性,表明是否用户在MouseArea按住了鼠标按钮,常用于属性绑定,可实现在鼠标按下时执行一些操作。

功能:

  • 鼠标事件处理:MouseArea提供了多个信号来处理不同的鼠标事件,如onClicked()、onDoubleClicked()、onPressed()、onReleased()和onPressAndHold()等。这些信号可以连接到相应的槽函数,以执行特定的操作。
  • 鼠标位置获取:在MouseEvent对象中,可以通过x和y属性获取鼠标的位置;通过button属性可以获取按下的按键;通过modifiers属性可以获取按下的键盘修饰符等。
  • 拖拽功能实现:MouseArea中的drag分组属性提供了一个使项目可以拖拽的简便方法。可以通过设置drag.target属性来指定拖动的项目id;drag.active属性获取项目当前是否正在被拖动的信息;drag.axis属性用来指定属性的拖动方向;drag.minimum和drag.maximum限制了项目在指定方向上拖动的距离。
  • 与其他组件结合使用:MouseArea可以与其他QML组件结合使用,如与Rectangle、Text等组合实现更复杂的界面布局和交互效果。例如,可以在Rectangle中添加MouseArea来实现点击、拖拽等交互功能。
  • 动态更新属性:可以通过JavaScript代码在鼠标事件处理函数中动态地修改其他组件的属性,实现界面的动态更新。例如,在onClicked信号处理函数中修改Rectangle的颜色、大小等属性。

示例:

Rectangle {id: rect1anchors.centerIn: parentwidth: 100height: 100border.width: 2border.color: "black"color: {mouseArea.containsPress ? "blue" :mouseArea.containsMouse ? "red" : "transparent"}MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: true}
}Rectangle {anchors.top: rect1.bottomanchors.horizontalCenter: parent.horizontalCentercolor: "yellow"width: 100; height: 100MouseArea {anchors.fill: parentonClicked: console.log("clicked yellow")}Rectangle {color: "blue"width: 50; height: 50MouseArea {anchors.fill: parentpropagateComposedEvents: trueonClicked: (mouse)=> {console.log("clicked blue")mouse.accepted = false}}}
}

鼠标悬停在上面的矩形内部时变为红色,持续点击则变为蓝色;

鼠标点击下面矩形的蓝色部分时,会打印两条信息,这是由于鼠标穿透。

    

2.Keys

Keys是一个用于处理键盘事件的附加属性,主要用于处理按键事件。

属性:

  • enabled:用于设置是否启用键盘处理,默认为true。当设置为false时,当前QML对象将无法响应按键事件。
  • forwardTo:用于指定将键盘事件转发到的目标对象。可以将键盘事件转发到其他QML对象进行处理。
  • priority:用于设置键盘事件的优先级。可以通过设置不同的优先级来控制键盘事件的处理顺序。

功能:

  • 按键事件处理:Keys提供了多个信号来处理不同的按键事件,如onPressed()、onReleased()、onClicked()等。这些信号可以连接到相应的槽函数,以执行特定的操作。
  • 获取按键信息:在按键事件处理函数中,可以通过event参数获取按键的详细信息,如按键的键值、修饰键状态等。
  • 组合按键检测:可以通过检测event.modifiers属性来判断是否有组合按键(如Ctrl+A)被按下。
  • 与其他组件结合使用:Keys通常与其他QML组件(如Rectangle、Text等)结合使用,为这些组件提供键盘交互功能。例如,可以在Rectangle中添加Keys来实现对矩形的键盘控制。
  • 动态更新属性:可以通过JavaScript代码在按键事件处理函数中动态地修改其他组件的属性,实现界面的动态更新。例如,在onPressed信号处理函数中修改Rectangle的颜色、大小等属性。

示例:

Item {anchors.centerIn: parentfocus: trueKeys.onSpacePressed: {console.log("1")}
}
RowLayout {anchors.fill: parentRectangle {id: rect1Layout.fillHeight: trueLayout.fillWidth: truecolor: "red"MouseArea {anchors.fill: parentonClicked: rect1.forceActiveFocus()}Keys.onPressed: {console.log("red")}}Rectangle {id: rect2Layout.fillHeight: trueLayout.fillWidth: truecolor: "blue"MouseArea {anchors.fill: parentonClicked: rect2.forceActiveFocus()}Keys.onPressed: {console.log("blue")}}
}

点击红色区域,按下任意按键,打印“red”;点击蓝色区域,按下任意按键,打印“blue”。

     

3.Timer

Timer是一个用于创建定时器的组件,用于在指定的时间间隔内执行或重复执行某个任务。

定时器属性:

  • interval:设置定时器的时间间隔,单位为毫秒,默认值为1000毫秒。
  • repeat:设置定时器是否重复触发,默认为false,即只触发一次。
  • running:设置定时器是否正在运行,默认为false。
  • triggeredOnStart:设置定时器是否在启动时立即触发,默认为false。

定时器信号:

  • triggered():定时器触发时发出的信号,可以通过onTriggered属性来指定触发时执行的操作。

定时器方法:

  • start():启动定时器,如果定时器已经在运行,则调用此方法无效。
  • restart():重启定时器,如果定时器没有运行,它将被启动,否则它将重置到初始状态并启动。
  • stop():停止定时器。

示例:

Label {id: labelanchors.centerIn: parenttext: Qt.formatDateTime(new Date, "yyyy-MM-dd hh:mm:ss")Timer {running: truerepeat: trueinterval: 1000onTriggered: {parent.text = Qt.formatDateTime(new Date, "yyyy-MM-dd hh:mm:ss")}}
}

每隔1秒触发一次定时器并刷新当前时间。

      

4.Loader

Loader是一个用于动态加载QML组件的元素。

属性:

  • source:用于指定要加载的QML文件的路径或URL。
  • sourceComponent:用于指定要加载的Component对象。
  • asynchronous:用于设置是否异步加载组件,默认为false。
  • item:用于访问加载的组件的顶层Item。
  • status:用于获取加载状态,可能的值包括Loader.Null、Loader.Ready、Loader.Loading和Loader.Error。
  • progress:用于获取加载进度,取值范围从0到1。

功能:

  • 动态加载组件:Loader可以在运行时加载QML文件或Component对象,这对于延迟创建组件或根据需要加载组件非常有用。
  • 切换页面或组件:通过改变source或sourceComponent属性,可以在不同的页面或组件之间切换。
  • 接收加载组件的信号:可以使用Connections元素接收来自加载组件的信号。
  • 处理焦点和键盘事件:Loader是一个焦点作用域,可以处理焦点和键盘事件,确保事件不传播到父项目。
  • 获取加载状态和进度:可以通过status和progress属性获取加载状态和进度,以便在加载过程中提供反馈。
  • 动态创建和销毁组件:Loader可以根据需要动态创建和销毁组件,提高应用程序的性能和资源利用率。

示例:

Component {id: compt_1Rectangle {color: "red"MouseArea {anchors.fill: parentonClicked: console.log(text_name)  //可以直接使用}}
}Component {id: compt_2Rectangle {color: "blue"}
}Row {Button {text: "red"onClicked: loader.sourceComponent = compt_1}Button {text: "blue"onClicked: loader.sourceComponent = compt_2}
}Loader {id: loaderanchors.centerIn: parentwidth: 200height: 200property string text_name : "loader"sourceComponent: compt_1
}

点击按钮,加载器会切换对应组件,点击红色区域会打印“loader”。

     

5.Component

Component是一种用于创建可重用的自定义组件的元素。

①status:这是一个反映组件状态的属性。

可能的取值有:

  • Component.Null:表示组件处于初始状态,还未进行加载或者创建相关操作。
  • Component.Loading:意味着组件正在加载或者创建的过程之中。
  • Component.Ready:表明组件已经准备好,可以用于创建实例等操作。
  • Component.Error:表示在组件的加载或者创建过程中发生了错误。

②createObject(parent):用于创建组件的实例。

参数:需要传入一个父项(parent)作为参数,这个父项将成为创建出来的实例的父对象。

前提条件:在使用这个方法之前,通常需要先确保组件的status属性为Component.Ready,这样才能成功创建实例。

示例:

Item {anchors.fill: parentComponent {id: comptRectangle {width: 100height: 50border.width: 2border.color: "black"}}Column {id: colanchors.centerIn: parentwidth: children.widthheight: children.heightButton {text: "add rect"onClicked: compt.createObject(col, {})}}
}

点击按钮会在下方生成一个矩形,这些矩形按列中心排放。


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

相关文章

PL/SQL 变量以及数据类型(下篇)

目录 二、数据类型 1.复合类型 记录类型 记录类型定义方式 记录类型的操作 表类型 嵌套表 可变数组 记录类型与表类型的区别 2.引用类型(未深入研究) 3.LOB(long object)类型 LOB类型的种类 4.属性类型(记录类型中已有示例,不过…

通过Chatbox和API实现本地使用DeepSeek(R1满血版)

1、注册用户,申请API DeepSeek满血版api注册链接(注册即送2000万Token) 1.1 注册:https://cloud.siliconflow.cn/i/yl6uVodF 1.2 注册完成之后,申请API密钥 2、下载Chatbox 2.1 下载安装包:https://cha…

IntelliJ IDEA 安装与使用完全教程:从入门到精通

一、引言 在当今竞争激烈的软件开发领域,拥有一款强大且高效的集成开发环境(IDE)是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE,凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…

嵌入式接单/派单网站

1.适合小公司接单或者个人挣钱。 2.适合有小需求快速变现。 快包专业的电子项目定制开发服务平台_我爱方案网 2.立创接单。 https://oshwhub.com/activities/spark2025

declare和less

declare -x LESSCLOSE"/usr/bin/lesspipe %s %s" declare -x LESSOPEN"| /usr/bin/lesspipe %s" declare 是一个在 **Unix/Linux Shell**(如 Bash)中用于声明变量及其属性的命令。它通常用于设置变量的值、类型以及一些特殊属性&a…

Docker安装常用软件说明

1.总体步骤 2.安装tomcat docker run -d -p 8080:8080 --name tomcat1 tomcat:11.0.8 访问tomcat猫首页 出现404 这是正常情况 Docker 默认采用的是 NAT 网络模式,所以会自动创建 IPtable 规则并自动开放端口,所以无需考虑防火墙问题 新版Tomcat已经…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…

Github自定义readme文件 个人主页简介 模版

自己写的 样式 # 👋 Hi bro , Im Dduo ! Glad to meet you 😁😍😜- 📚 Im Dduo, a student. Feel free to reach out if youd like to chat or collaborate! 😊 - 💬 Dont hesitate to reach …