QML 菜单控件:MenuBar、MenuBarItem、Menu、MenuItem层级关系和用法

news2025/7/19 17:50:00

目录

    • 引言
    • 相关阅读
    • 关于MenuBarItem
    • 核心代码
      • 1. 主菜单栏 (MenuBar.qml)
      • 2. 主页面,包含右键菜单 (MainPage.qml)
      • 3. 主界面绑定 (Main.qml)
      • 整体结构
    • 运行效果
    • 总结
    • 工程下载

引言

在 GUI 开发中,菜单是用户交互的核心组件。QML 提供了一套灵活的菜单控件(MenuBarMenuMenuItem 等),本文将通过代码示例和图解,帮助理解它们的层级关系和用法。

相关阅读

  • Qt 官方文档:QML Menu 类型
  • 菜单层级图(Mermaid):
包含
可包含
触发展开
包含
子菜单(递归)
包含
«顶级容器»
MenuBar
+ 作为主菜单栏容器
+ 包含多个MenuBarItem或Menu
«直接子项»
MenuBarItem
+ 位于MenuBar内
+ 点击展开关联的Menu
«下拉菜单»
Menu
+ 可嵌套层级
+ 包含多个MenuItem
«基础项»
MenuItem
+ 可执行动作
+ 可包含子Menu(形成层级)
«独立弹出菜单»
ContextMenu
+ 由右键触发
+ 结构与Menu类似

关于MenuBarItem

MenuBarItem 在 MenuBar 中显示 Menu。当通过键盘、鼠标或触摸触发 MenuBarItem 时,将显示相应的下拉菜单。MenuBarItem 用作 MenuBar 的默认代理类型。请注意,在使用 MenuBar 时,无需手动声明 MenuBarItem 实例。将 Menu 实例声明为 MenuBar 的子项就足够了,并且会自动创建相应的项。

简单来说,在实际使用的时候,直接使用Menu即可。


核心代码

1. 主菜单栏 (MenuBar.qml)

// MenuBar.qml
import QtQuick
import QtQuick.Controls

MenuBar {
    Menu {
        title: "文件"
        MenuItem { text: "新建"; onTriggered: console.log("新建文件") }
        MenuItem { text: "打开" }
        Menu {
            title: "最近打开"
            MenuItem { text: "文档1.qml" }
            MenuItem { text: "项目2.pro" }
        }
    }
}

这是一个典型的QML菜单栏(MenuBar)实现,用于创建应用程序的顶部菜单。具体结构如下:

MenuBar
Menu: 文件
MenuItem: 新建
MenuItem: 打开
Menu: 最近打开
MenuItem: 文档1.qml
MenuItem: 项目2.pro

2. 主页面,包含右键菜单 (MainPage.qml)

// MainPage.qml
import QtQuick
import QtQuick.Controls

Pane {
    id: root
    anchors.fill: parent

    Text {
        id: mainText
        anchors.centerIn: parent
        text: "右键点击显示上下文菜单"
        font.pixelSize: 16
    }

    Menu {
        id: contextMenu
        
        MenuItem {
            text: "复制"
            onTriggered: console.log("复制被点击")
        }
        MenuItem {
            text: "粘贴"
            onTriggered: console.log("粘贴被点击")
        }
        MenuItem {
            text: "剪切"
            onTriggered: console.log("剪切被点击")
        }
        MenuSeparator { }
        MenuItem {
            text: "刷新"
            onTriggered: console.log("刷新被点击")
        }
    }

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onClicked: function(mouseEvent) {
            if (mouseEvent.button === Qt.RightButton) {
                contextMenu.popup()
            }
        }
    }
}

MainPage实现了一个带有右键上下文菜单的页面,在页面中心显示提示文本"右键点击显示上下文菜单"。
菜单结构如下:

Menu: contextMenu
MenuItem: 复制
MenuItem: 粘贴
MenuItem: 剪切
MenuSeparator
MenuItem: 刷新

3. 主界面绑定 (Main.qml)

// Main.qml
import QtQuick
import QtQuick.Controls
import "."  // 添加本地目录导入

ApplicationWindow {
    id: window
    width: 400
    height: 400
    visible: true
    title: "QML菜单示例"

    // 绑定主菜单栏, 引用 MenuBar.qml
    menuBar: MenuBar { }  

    // 主要内容区域
    MainPage { }
} 

Main.qml 定义应用程序主窗口,它包含了一个顶部菜单栏(MenuBar.qml)和主要内容区域(MainPage.qml)。

整体结构

ApplicationWindow
MenuBar
MainPage
Menu: 文件
MenuItem: 新建
MenuItem: 打开
Menu: 最近打开
MenuItem: 文档1.qml
MenuItem: 项目2.pro
Text: 提示文本
Menu: contextMenu
MenuItem: 复制
MenuItem: 粘贴
MenuItem: 剪切
MenuSeparator
MenuItem: 刷新

运行效果

QML菜单示例

  • 主菜单栏点击展开嵌套菜单
  • 右键弹出上下文菜单,菜单项点击触发控制台输出

总结

通过这个示例,可以清晰看到:MenuBar 作为根容器,Menu 管理层级,MenuItem 作为基础操作项,而 ContextMenu 独立处理右键交互。官方文档提供了以下几种类型:
Qt文档
但实际上,开发者只需要其中3种即可(图中圈出的部分:Menu, MenuBar, MenuItem


工程下载

完整代码已上传 GitHub:GitCode - QML Menu示例

GitCode代码

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

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

相关文章

蓝桥杯嵌入式第十四届模拟二

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…

Qt 入门 1 之第一个程序 Hello World

Qt 入门1之第一个程序 Hello World 直接上操作步骤从头开始认识,打开Qt Creator,创建一个新项目,并依次执行以下操作 在Qt Creator中,一个Kits 表示一个完整的构建环境,包括编译器、Qt版本、调试器等。在上图中可以直…

架构思维: 全链路日志深度解析

文章目录 引言:微服务时代的日志挑战一、业务痛点与需求分析二、技术选型的六维评估模型1. 标准化支持 OpenTracing2. 存储扩展性3. 性能损耗4. 功能完备性5. 侵入性控制6. 社区生态 三、SkyWalking落地实践与调优1. 核心架构解析2. 关键配置示例: 采样率…

唯美社区源码AM社区同款源码

源码介绍 唯美社区源码AM社区同款源码 后端修改application.properties文件内容为你的数据库 前端修改/config/config.js文件内容为你的后端地址 这两个文件里要修改的地方我已经用中文标注出来了 截图 源码免费下载 唯美社区源码AM社区同款源码

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()函数实现

一、现在有一个问题描述&#xff1a;有两个字符串&#xff0c;要按照字典顺序比较它们的大小&#xff08;注意所有的小写字母都大于所有的大写字母 &#xff09;。 二、代码 #include <bits/stdc.h> using namespace std;int main() {string str1 "apple";…

Scala面向对象2

1. 抽象属性和方法&#xff1a;用 abstract 关键字定义抽象类&#xff0c;其中抽象属性无初始值&#xff0c;抽象方法无实现 。重写抽象方法需用 override &#xff0c;重写抽象属性时&#xff0c;可变属性用 var &#xff0c;不可变属性用 val 。 匿名子类&#xff1a;和 Jav…

【FPGA基础学习】状态机思想实现流水灯

目录 一、用状态机实现LED流水灯1.状态机思想简介1. 1基本概念1.2.核心要素1.3分类与模型 2.LED流水灯 二、CPLD与FPGA1.技术区别2.应用场景3.设计选择建议 三、HDLbits组合逻辑题目 一、用状态机实现LED流水灯 1.状态机思想简介 1. 1基本概念 ​ 状态机&#xff08;Finite …

图片尺寸修改软件下载

【图片尺寸调整工具v1.0&#xff1a;高效便捷的图像处理助手】 图片尺寸调整工具v1.0是一款专为简化图像处理流程设计的轻量级软件&#xff0c;兼顾高效批量处理与个性化单图调整需求。该工具以"零学习成本"为核心设计理念&#xff0c;通过简洁直观的交互界面&#…

MySQL-SQL-DDL语句、表结构创建语句语法、表约束、表数据类型,表结构-查询SQL、修改SQL、删除SQL

一.SQL SQL&#xff1a;一门操作关系型数据库的编程语言&#xff0c;定义操作所有关系型数据库的统一标准 二. DDL-数据库 1. 查询所有数据库 命令&#xff1a;show databases; 2. 查询当前数据库 命令&#xff1a;select database(); 3. 创建数据库 命令&#xff1a;create da…

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…

鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能

鸿蒙版(ArkTs) 贪吃蛇&#xff0c;包含无敌模式 最高分 暂停和继续功能; 效果图如下&#xff1a; 代码如下&#xff1a; // 所有import语句必须放在文件开头 import router from ohos.router; import promptAction from ohos.promptAction; // Add this import at the top wit…

解决Win11耳机没有声音的问题

方法一&#xff1a;更新驱动程序&#xff08;有效&#xff09; 进入 “设置”&#xff08;快捷键&#xff1a;WinX&#xff09;&#xff0c;点击 “Windows 更新” → “高级选项” 点击 “可选更新” &#xff0c;然后点击 “驱动程序更新” 【注】&#xff1a;更新后可能会出…

【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean

文章目录 &#x1f30d;一. bean 创建顺序&#x1f30d;二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节 &#x1f30d;三. bean 的生命周期&#x1f30d;四. 配置 bean 的后置处理器 【这个比较难】&#x1f30d;五. 通过属性文件给 bean 注入值&#x1f30d;六. 基于 X…

内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新

目录 1. NetBIOS 名称的网络协议在局域网中内网渗透中起到什么作用 2. 使用 UDP 端口耗尽技术强制所有 DNS 查找失败&#xff0c;这个技术如何应用在局域网内网渗透测试中 3. 在本地创建一个 HTTP 服务来伪造 WPAD 服务器 什么是 WPAD 服务器&#xff1f;这个服务器是干嘛的…

el-tabs添加按钮增加点击禁止样式

前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮&#xff0c;没有点击样式&#xff0c;用户感知不明显没有限制最大的tab添加数量&#xff0c;可以无限添加 调整目标&代码编写 调整目标…