QML 菜单控件:MenuBar、MenuBarItem、Menu、MenuItem层级关系和用法
目录
- 引言
- 相关阅读
- 关于MenuBarItem
- 核心代码
- 1. 主菜单栏 (MenuBar.qml)
- 2. 主页面,包含右键菜单 (MainPage.qml)
- 3. 主界面绑定 (Main.qml)
- 整体结构
- 运行效果
- 总结
- 工程下载
引言
在 GUI 开发中,菜单是用户交互的核心组件。QML 提供了一套灵活的菜单控件(MenuBar、Menu、MenuItem 等),本文将通过代码示例和图解,帮助理解它们的层级关系和用法。
相关阅读
- Qt 官方文档:QML Menu 类型
- 菜单层级图(Mermaid):
关于MenuBarItem
MenuBarItem 在 MenuBar 中显示 Menu。当通过键盘、鼠标或触摸触发 MenuBarItem 时,将显示相应的下拉菜单。MenuBarItem 用作 MenuBar 的默认代理类型。请注意,在使用 MenuBar 时,无需手动声明 MenuBarItem 实例。将 Menu 实例声明为 MenuBar 的子项就足够了,并且会自动创建相应的项。
简单来说,在实际使用的时候,直接使用Menu即可。
核心代码
1. 主菜单栏 (MenuBar.qml)
// MenuBar.qml
import QtQuick
import QtQuick.ControlsMenuBar {Menu {title: "文件"MenuItem { text: "新建"; onTriggered: console.log("新建文件") }MenuItem { text: "打开" }Menu {title: "最近打开"MenuItem { text: "文档1.qml" }MenuItem { text: "项目2.pro" }}}
}
这是一个典型的QML菜单栏(MenuBar)实现,用于创建应用程序的顶部菜单。具体结构如下:
2. 主页面,包含右键菜单 (MainPage.qml)
// MainPage.qml
import QtQuick
import QtQuick.ControlsPane {id: rootanchors.fill: parentText {id: mainTextanchors.centerIn: parenttext: "右键点击显示上下文菜单"font.pixelSize: 16}Menu {id: contextMenuMenuItem {text: "复制"onTriggered: console.log("复制被点击")}MenuItem {text: "粘贴"onTriggered: console.log("粘贴被点击")}MenuItem {text: "剪切"onTriggered: console.log("剪切被点击")}MenuSeparator { }MenuItem {text: "刷新"onTriggered: console.log("刷新被点击")}}MouseArea {anchors.fill: parentacceptedButtons: Qt.RightButtononClicked: function(mouseEvent) {if (mouseEvent.button === Qt.RightButton) {contextMenu.popup()}}}
}
MainPage实现了一个带有右键上下文菜单的页面,在页面中心显示提示文本"右键点击显示上下文菜单"。
菜单结构如下:
3. 主界面绑定 (Main.qml)
// Main.qml
import QtQuick
import QtQuick.Controls
import "." // 添加本地目录导入ApplicationWindow {id: windowwidth: 400height: 400visible: truetitle: "QML菜单示例"// 绑定主菜单栏, 引用 MenuBar.qmlmenuBar: MenuBar { } // 主要内容区域MainPage { }
}
Main.qml 定义应用程序主窗口,它包含了一个顶部菜单栏(MenuBar.qml)和主要内容区域(MainPage.qml)。
整体结构
运行效果

- 主菜单栏点击展开嵌套菜单
- 右键弹出上下文菜单,菜单项点击触发控制台输出
总结
通过这个示例,可以清晰看到:MenuBar 作为根容器,Menu 管理层级,MenuItem 作为基础操作项,而 ContextMenu 独立处理右键交互。官方文档提供了以下几种类型:

但实际上,开发者只需要其中3种即可(图中圈出的部分:Menu, MenuBar, MenuItem)
工程下载
完整代码已上传 GitHub:GitCode - QML Menu示例

相关文章:
QML 菜单控件:MenuBar、MenuBarItem、Menu、MenuItem层级关系和用法
目录 引言相关阅读关于MenuBarItem核心代码1. 主菜单栏 (MenuBar.qml)2. 主页面,包含右键菜单 (MainPage.qml)3. 主界面绑定 (Main.qml)整体结构 运行效果总结工程下载 引言 在 GUI 开发中,菜单是用户交互的核心组件。QML 提供了一套灵活的菜单控件&…...
设计模式简述(十二)策略模式
策略模式 描述基本使用使用传统策略模式的缺陷以及规避方法 枚举策略描述基本使用使用 描述 定义一组策略,并将其封装起来到一个策略上下文中。 由调用者决定应该使用哪种策略,并且可以动态替换 基本使用 定义策略接口 public interface IStrategy {…...
Telegram机器人开发
注册机器人 :使用Botfather 按照提示快速注册,会得到一串密钥 格式类似 7878875019:BAGQ9AihJyE5jmSoWMt4O1j1CQThjfwR0nk # !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: TelegramBot.py time: 202…...
蓝桥杯嵌入式第十四届模拟二
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…...
java发送http请求
常用的方式 jdk自带的工具类apache的httpclient工具类spring的resttemplate工具类 如果是springboot项目,推荐resttemplate,其它项目推荐httpclient httpclient教程 httpclient教程...
Qt 入门 1 之第一个程序 Hello World
Qt 入门1之第一个程序 Hello World 直接上操作步骤从头开始认识,打开Qt Creator,创建一个新项目,并依次执行以下操作 在Qt Creator中,一个Kits 表示一个完整的构建环境,包括编译器、Qt版本、调试器等。在上图中可以直…...
架构思维: 全链路日志深度解析
文章目录 引言:微服务时代的日志挑战一、业务痛点与需求分析二、技术选型的六维评估模型1. 标准化支持 OpenTracing2. 存储扩展性3. 性能损耗4. 功能完备性5. 侵入性控制6. 社区生态 三、SkyWalking落地实践与调优1. 核心架构解析2. 关键配置示例: 采样率…...
PHP 项目搭建 ELK 日志监控体系完整指南
ELK (Elasticsearch Logstash Kibana) 是当前最流行的日志管理解决方案之一。下面详细介绍如何为 PHP 项目搭建完整的 ELK 日志监控体系。 一、基础架构组成 PHP应用 → Filebeat → Logstash → Elasticsearch → Kibana(可选) ↗ 二、环境准备 1. 服务器要求 建议独立服…...
唯美社区源码AM社区同款源码
源码介绍 唯美社区源码AM社区同款源码 后端修改application.properties文件内容为你的数据库 前端修改/config/config.js文件内容为你的后端地址 这两个文件里要修改的地方我已经用中文标注出来了 截图 源码免费下载 唯美社区源码AM社区同款源码...
《野史未必假》王磊
文章目录 前言一、禅让制的真相:让了,又没有完全让禅让制的真相尧舜禹之间的“禅让”实际上是一场权力斗争 二、美女间谍的下落:西施和范蠡终成眷属了吗范蠡的逃亡“美人计”的真相 三、“背叛”的名将:魏延真的有“反骨”吗?“子…...
Redis 热key问题怎么解决?
Redis 热 Key 问题分析与解决方案 热 Key(Hot Key)是指被高频访问的某个或多个 Key,导致单个 Redis 节点负载过高,可能引发性能瓶颈甚至服务崩溃。以下是常见原因及解决方案: 1. 热 Key 的常见原因 突发流量:如明星八卦、秒杀商品、热门直播等场景。缓存设计不合理:如全…...
定制一款国密浏览器(3):修改浏览器应用程序安装路径
在上一章中介绍了如何修改 deb 包的包名,这一章讲一下如何修改浏览器应用程序安装路径。 chromium deb 包将程序文件安装在 /usr/share/chromium 下,但在很多系统中(比如统信 UOS 和 麒麟系统),规范要求应用程序安装在 /opt/apps 下。此外,对一些不可变系统(比如 deepi…...
3. go-zero中如何使用redis
问题 go-zero项目相关文档中redis是这样配置的: Name: account.rpc ListenOn: 0.0.0.0:8080 Etcd:Hosts:- 127.0.0.1:2379Key: account.rpcMysql:Host: xxxx:3306User: rootPass: xxxData: mall-userCharset: utf8mb4Cache: - Host: 192.168.145.10:6379Type: nod…...
cpp自学 day19(多态)
一、基本概念 同一操作作用于不同的对象,产生不同的执行结果 👉 就像「按F1键」:在Word弹出帮助文档,在PS弹出画笔设置,同一个按键触发不同功能 (1)多态类型 类型实现方式绑定时机静态多态…...
【算法/c++】利用中序遍历和后序遍历建二叉树
目录 题目:树的遍历前言题目来源树的数组存储基本思想存储规则示例 建树算法关键思路代码总代码 链表法 题目:树的遍历 前言 如果不是完全二叉树,使用数组模拟树,会很浪费空间。 题目来源 本题来自 PTA 天梯赛。 题目链接: 树…...
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(一)
1. 背景 arXiv简介(参考DeepSeek大模型生成内容): arXiv(发音同“archive”,/ˈɑːrkaɪv/)是一个开放的学术预印本平台,主要用于研究人员分享和获取尚未正式发表或已完成投稿的学术论文。创…...
cpp经典数论问题
题目如下 思路 代码如下...
C++中如何比较两个字符串的大小--compare()函数实现
一、现在有一个问题描述:有两个字符串,要按照字典顺序比较它们的大小(注意所有的小写字母都大于所有的大写字母 )。 二、代码 #include <bits/stdc.h> using namespace std;int main() {string str1 "apple";…...
微软2025年AI技术深度解析:从多模态大模型到企业级代理服务
微软2025年AI技术深度解析:从多模态大模型到企业级代理服务 一、微软AI技术全景概览 在2025年的AI领域,微软通过Azure AI Foundry、多模态大模型、企业级AI代理三大核心技术,构建了覆盖开发、部署、应用全流程的AI生态体系。根据最新财报数…...
C++中的匿名函数
代码解析 auto getTicks [](QCPAxis *axis) -> QList<double> {QList<double> ticks;if(auto ticker static_cast<QCPAxisTickerFixed *>(axis->ticker().data())){double current axis->range().lower;const double step ticker->…...
浏览器 路由详解
Hash路由 URL 结构:http://example.com/#/path,# 后的部分称为哈希(Hash)。无刷新特性:浏览器不会将哈希部分发送到服务器,改变哈希值不会触发页面刷新。事件驱动:URL…...
Scala面向对象2
1. 抽象属性和方法:用 abstract 关键字定义抽象类,其中抽象属性无初始值,抽象方法无实现 。重写抽象方法需用 override ,重写抽象属性时,可变属性用 var ,不可变属性用 val 。 匿名子类:和 Jav…...
【FPGA基础学习】状态机思想实现流水灯
目录 一、用状态机实现LED流水灯1.状态机思想简介1. 1基本概念1.2.核心要素1.3分类与模型 2.LED流水灯 二、CPLD与FPGA1.技术区别2.应用场景3.设计选择建议 三、HDLbits组合逻辑题目 一、用状态机实现LED流水灯 1.状态机思想简介 1. 1基本概念 状态机(Finite …...
HTML表单属性2
HTML5针对<input>添加了许多属性: autofocus属性 页面加载时自动聚焦到输入字段 <form action"action_page.php" >名字: <input type"text" name"fnam" autofocus><br>姓氏:<in…...
图片尺寸修改软件下载
【图片尺寸调整工具v1.0:高效便捷的图像处理助手】 图片尺寸调整工具v1.0是一款专为简化图像处理流程设计的轻量级软件,兼顾高效批量处理与个性化单图调整需求。该工具以"零学习成本"为核心设计理念,通过简洁直观的交互界面&#…...
202521 | 远程调用 | 注册中心
远程调用 1. 核心方案全景图 #mermaid-svg-f3oyP1p2P8a2lAuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-f3oyP1p2P8a2lAuW .error-icon{fill:#552222;}#mermaid-svg-f3oyP1p2P8a2lAuW .error-text{fill:#55222…...
MySQL-SQL-DDL语句、表结构创建语句语法、表约束、表数据类型,表结构-查询SQL、修改SQL、删除SQL
一.SQL SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准 二. DDL-数据库 1. 查询所有数据库 命令:show databases; 2. 查询当前数据库 命令:select database(); 3. 创建数据库 命令:create da…...
网络钓鱼攻击的威胁和执法部门的作用(第一部分)
在当今的数字世界中,网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段,用于欺骗人们提供敏感信息,例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...
鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能
鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能; 效果图如下: 代码如下: // 所有import语句必须放在文件开头 import router from ohos.router; import promptAction from ohos.promptAction; // Add this import at the top wit…...
设计模式简述(十三)适配器模式
适配器模式 描述基本使用使用关于适配器关联不兼容类的方式如果原有抽象层是抽象类若原有抽象是接口使用 描述 适配器模式常用于系统已经上限稳定运行,但现有需求需要将两个不匹配的类放到一起工作时使用。 也就是说这是一个迭代阶段使用的模式。 这种模式&#x…...
