QML菜单控件:菜单的常规用法

目录

    • 引言
    • 📚相关阅读
    • 🔨BUG修复
    • 工程结构
    • 示例详解
      • 示例1:上下文菜单(ContextMenu)
      • 示例2:菜单栏(MenuBar)
      • 示例3:动态菜单
      • 示例4:快捷键菜单
      • 示例5:可选项菜单
    • 总结
    • 工程下载

引言

在Qt Quick应用程序开发中,菜单是一个非常重要的用户界面组件。它可以帮助我们组织和管理应用程序的功能,提供更好的用户体验。本文将介绍QML中菜单控件的几种常见用法,通过5个具体的示例来展示如何实现不同类型的菜单。

📚相关阅读

  • Qt官方文档:Menu
  • QML菜单控件: 构建统一的菜单样式
  • QML 菜单控件:MenuBar、MenuBarItem、Menu、MenuItem层级关系和用法

🔨BUG修复

  • 解决示例5 check状态失效的问题

工程结构

Main.qml
Menu1.qml
Menu2.qml
Menu3.qml
Menu4.qml
Menu5.qml
icons
copy.png
cut.png

示例详解

示例1:上下文菜单(ContextMenu)

这个示例展示了如何创建一个右键点击触发的上下文菜单。

import QtQuick
import QtQuick.ControlsRectangle {width: 400height: 300color: "lightgray"Button {text: "右键点击显示菜单"anchors.centerIn: parentMouseArea {anchors.fill: parentacceptedButtons: Qt.RightButtononClicked: contextMenu.popup()}}Menu {id: contextMenuMenuItem {text: "复制"icon.source: "icons/copy.png"onTriggered: console.log("复制被点击")}MenuItem {text: "剪切"icon.source: "icons/cut.png"onTriggered: console.log("剪切被点击")}MenuSeparator { }MenuItem {text: "退出"onTriggered: Qt.quit()}}
}

代码解释:

  1. 使用MouseArea捕获右键点击事件
  2. Menu组件定义了一个上下文菜单
  3. MenuItem定义菜单项,可以包含图标
  4. MenuSeparator添加分隔线
  5. 通过popup()方法显示菜单

运行效果:

上下文菜单

示例2:菜单栏(MenuBar)

这个示例展示了如何创建一个标准的菜单栏。

import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsRectangle {width: 400height: 300color: "lightgray"MenuBar {width: parent.widthMenu {title: "文件"MenuItem {text: "新建"onTriggered: console.log("新建文件")}Menu {title: "最近打开"MenuItem { text: "文档1" }MenuItem { text: "文档2" }}MenuSeparator { }MenuItem {text: "退出"onTriggered: Qt.quit()}}}
}

代码解释:

  1. MenuBar组件创建菜单栏
  2. 可以嵌套多个Menu创建子菜单
  3. 每个Menu都有标题和菜单项
  4. 支持菜单项的事件处理

运行效果:

菜单栏

示例3:动态菜单

这个示例展示了如何动态生成菜单项。

import QtQuick
import QtQuick.ControlsRectangle {width: 400height: 300color: "lightgray"Button {text: "点击显示动态菜单"anchors.centerIn: parentonClicked: dynamicMenu.popup()}Menu {id: dynamicMenuInstantiator {model: ["选项1", "选项2", "选项3"]delegate: MenuItem {text: modelDataonTriggered: console.log("选择了:", modelData)}onObjectAdded: function(index, object) {dynamicMenu.insertItem(index, object)}onObjectRemoved: function(index, object) {dynamicMenu.removeItem(object)}}}
}

代码解释:

  1. 使用Instantiator动态创建菜单项
  2. 通过model提供数据源
  3. delegate定义每个菜单项的样式和行为
  4. 支持动态添加和删除菜单项

运行效果:

动态菜单

示例4:快捷键菜单

这个示例展示了如何创建支持快捷键的菜单。

import QtQuick
import QtQuick.ControlsRectangle {width: 400height: 300color: "lightgray"MenuBar {width: parent.widthMenu {title: "编辑"Action {id: copyActiontext: "复制 (Ctrl+C)"icon.source: "icons/copy.png"shortcut: StandardKey.CopyonTriggered: console.log("复制")}Action {id: cutActiontext: "剪切 (Ctrl+X)"icon.source: "icons/cut.png"shortcut: StandardKey.CutonTriggered: console.log("剪切")}}}Text {anchors.centerIn: parenttext: "使用快捷键 Ctrl+C 和 Ctrl+X\n触发菜单功能"horizontalAlignment: Text.AlignHCenter}
}

代码解释:

  1. 使用Action组件定义带快捷键的菜单项
  2. shortcut属性设置快捷键
  3. 支持标准快捷键(如StandardKey.Copy
  4. 可以同时显示快捷键提示

运行效果:

快捷键菜单

示例5:可选项菜单

这个示例展示了如何创建包含复选框和单选按钮的菜单。

import QtQuick
import QtQuick.ControlsRectangle {width: 400height: 300color: "lightgray"Button {text: "设置菜单"anchors.centerIn: parentonClicked: settingsMenu.popup()}Menu {id: settingsMenutitle: "设置"Action {id: autoSaveActiontext: "自动保存"checkable: truechecked: falseonTriggered: {console.log("自动保存:", checked)}}Menu {title: "主题"MenuItem {text: "浅色"checkable: truechecked: trueButtonGroup.group: themeGroup}MenuItem {text: "深色"checkable: trueButtonGroup.group: themeGroup}}}ButtonGroup {id: themeGroup}
}

代码解释:

  1. checkable属性使菜单项可选中
  2. checked属性控制选中状态
  3. 使用ButtonGroup管理单选按钮组
  4. 支持嵌套菜单结构

运行效果:

可选菜单


总结

本文通过5个具体的示例,展示了QML中菜单控件的常见用法:

  1. 上下文菜单:通过右键点击触发
  2. 菜单栏:创建标准的应用程序菜单
  3. 动态菜单:根据数据动态生成菜单项
  4. 快捷键菜单:支持键盘快捷键操作
  5. 可选项菜单:包含复选框和单选按钮

工程下载

您可以在Gitcode上获取完整的示例代码:GitCode QML菜单的常规用法

GitCode - qml menu usage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue-路由案例】面经基础版

目录 <<回到导览1.面经基础版1.1.VueCli建项目1.1.1.VueCli 自定义项目1.1.2.ESlint代码规范 1.2.项目路由1.2.1.一级路由配置1.2.2.二级配置路由1.2.3.设置高亮1.2.4.发生请求、渲染1.2.5.跳转传参、再发请求1.2.6.体验优化1.2.7.keep-alive <<回到导览 1.面经基…

【T2I】MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis

code&#xff1a;CVPR 2024 MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis [CVPR 2024] MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis - 知乎 Abstract 我们提出了一个多实例生成(Multi-Instance Generation, MIG)任务…

用AI来了解用户都在关注的品牌问题是什么?

​ ​​用户重复问的核心问题整理​​ 基于百度文心一言、豆包、KIMI、腾讯元宝、DeepSeek五大模型的回答&#xff0c;企业最关注的GEO问题可归纳为以下10类&#xff08;按优先级排序&#xff09;&#xff1a; ​​1. GEO是什么&#xff1f;与传统SEO有何本质区别&#xff1f…

OpenCv(七)——模板匹配、打包、图像的旋转

目录 一、模板匹配 模板匹配原理 1、单模板之间的匹配 &#xff08;1&#xff09;读取并显示待匹配的图片和模板图片 &#xff08;2&#xff09;模板匹配并绘制匹配位置的外接矩形 &#xff08;3&#xff09;显示最终的效果 2、模板与多个对象匹配&#xff0c;仅匹配当前…

蓝桥云客 最大和

问题描述 小蓝在玩一个寻宝游戏&#xff0c;游戏在一条笔直的道路上进行&#xff0c;道路被分成了 n 个方格&#xff0c;依次编号 1 至 n&#xff0c;每个方格上都有一个宝物&#xff0c;宝物的分值是一个整数&#xff08;包括正数、负数和零&#xff09;&#xff0c;当进入一…

【C++算法】49.分治_归并_计算右侧小于当前元素的个数

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 315. 计算右侧小于当前元素的个数 题目描述&#xff1a; 解法 归并排序&#xff08;分治&#xff09; 当前元素的后面&#xff0c;有多少个比我小。&#xff08;降序&…

IPSec简单例子

实验说明 使用Ensp模拟器实现IPsec隧道实验。IPSec是一种VPN技术&#xff0c;配置的思路首先是两个网络先通&#xff0c;然后配置ACL、IEK和IPSec对等体&#xff0c;从而建立VPN隧道。 实验拓扑 配置过程 1 配置IP地址以及OSPF路由 # 配置中使用了简写命令&#xff0c;不熟…

车载联网终端4G汽车TBOX介绍定义与概述

汽车 TBOX&#xff08;Telematics Box&#xff09;是专为汽车设计的远程通信终端设备&#xff0c;属于车联网系统的关键组成部分。车联网系统一般包含主机、汽车 T - BOX、手机 APP 及后台系统。融合了车身网络和 4G 无线通信技术&#xff0c;为汽车提供丰富的 Telematics 服务…

《DeepSeek RAG 增强检索知识库系统》Ollama DeepSeek 流式应答页面对接之三

前言 自从有了 AI 工具以后&#xff0c;所有以前头疼前端页面开发的后端程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;都漏出了友善&#x1f60a;微笑&#xff01; 主要我们可以清楚地表达编写页面诉求&#xff0c;AI 工具就可以非常准确且迅速的完成代码的实…

【MyBatis】深入解析 MyBatis:关于注解和 XML 的 MyBatis 开发方案下字段名不一致的的查询映射解决方案

注解查询映射 我们再来调用下面的 selectAll() 这个接口&#xff0c;执行的 SQL 是 select* from user_info&#xff0c;表示全列查询&#xff1a; 运行测试类对应方法&#xff0c;在日志中可以看到&#xff0c;字段名一致&#xff0c;Mybatis 就成功从数据库对应的字段中拿到…

深入理解Java性能调优与JVM底层机制

Java作为一种广泛应用的编程语言&#xff0c;在企业级应用中占据着举足轻重的地位。随着系统规模的扩大和业务需求的复杂化&#xff0c;性能调优成为了开发过程中不可忽视的一环。Java的性能瓶颈往往并不直接来自代码本身&#xff0c;而是与JVM&#xff08;Java虚拟机&#xff…

odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程

安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包&#xff0c;点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1&#xff0c;及其他客户相关信息&#xff0c;点…

Logo语言的在线课程学习

Logo语言在线课程学习的探索 引言 在信息技术快速发展的今天&#xff0c;编程已经成为一门重要的技能。尤其随着人工智能、数据分析和互联网技术的普及&#xff0c;各种编程语言层出不穷&#xff0c;其中Logo语言以其独特的教育意义和学习优势&#xff0c;逐渐受到学校和教育…

情感语音的“开源先锋”!网易开源

语音合成技术近年来取得了显著进步&#xff0c;特别是在语音克隆、语音助手、配音服务和有声读物等领域。然而&#xff0c;如何让合成的语音更具情感&#xff0c;更贴近人类的真实表达&#xff0c;一直是这一领域的重要研究方向。今天&#xff0c;我们将为大家介绍一款由网易有…

摄像头模块对焦方式的类型

摄像头模块的对焦方式直接影响成像清晰度和使用场景适应性&#xff0c;不同技术各有其优缺点。以下是常见对焦方式及其原理、特点和应用场景的详细说明&#xff1a; ‌1. 固定对焦&#xff08;Fixed Focus&#xff09;‌ ‌原理‌&#xff1a;镜头固定在特定距离&#xff08;…

使用Vue、Nodejs以及websocket搭建一个简易聊天室

简易聊天室 说在前面效果展示websocketwebsocket的由来websocket的特点 vue前端静态结构效果代码 点击切换用户以及该用户高亮实现思路效果展示 发送消息功能效果展示 连接服务端 Nodejs服务器端实现步骤代码 说在前面 在学习计算机网络的时候&#xff0c;看到了websocket这个…

【免费】2005-2019年各地级市绿色专利申请量数据

2005-2019年各地级市绿色专利申请量数据 1、时间2005-2019年 2、来源&#xff1a;国家知识产权局 3、指标&#xff1a;省份、城市、年份、绿色发明专利申请量、绿色实用新型专利申请量 4、范围&#xff1a;360地级市 5、指标解释&#xff1a;绿色专利是指涉及环保、新能源…

架构师面试(二十六):系统拆分

问题 今天我们聊电商系统实际业务场景的问题&#xff0c;考查对业务系统问题的分析能力、解决问题的能力和对系统长期发展的整体规划能力。 一电商平台在早期阶段业务发展迅速&#xff0c;DAU在 10W&#xff1b;整个电商系统按水平分层架构进行设计&#xff0c;包括【入口网关…

2. Qt界面文件原理

本节主要介绍ui文件如何与窗口关联&#xff0c;并通过隐式连接方式显示对话框 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 UI文件如何与窗口关联 1.1 mainwindow.cpp的头文件ui_mainwindow.h 根据编译原理的基本规…

雅思大作文写作——词伙、简单句、并列句的使用

词伙是一些可以表达我们常用观点的单词组合,这个组合可能不只是2-3个单词,也可能是很多单词组成的一个短句。 一、词伙使用 1. 不要中译英 2. 重视词伙,而非单词 如何替换表达 1. 如果要替换的是一个名词,如students,则有下面的一些方法: A. 使用替换词或者词组:y…