Qt (9)【Qt窗口 —— 如何在窗口中创建菜单栏和工具栏】

news2024/9/28 21:23:57

阅读导航

  • 引言
  • 一、Qt窗口简介
  • 二、如何在窗口中创建菜单栏
    • 1. 创建菜单栏
    • 2. 在菜单栏中添加菜单
    • 3. 创建菜单项
    • 4. 在菜单项之间添加分割线
  • 三、如何在窗口中创建工具栏
    • 1. 创建工具栏
    • 2. 设置停靠位置
    • 3. 设置浮动属性
    • 4. 设置移动属性

引言

在上一篇文章中,我们深入探讨了Qt框架中一些常用控件的使用方法,解锁了这些基础组件如何为我们的应用程序增添丰富的视觉展示与用户交互能力。今天,我们将踏上一段新的探索之旅,聚焦于Qt窗口设计的另一个关键方面——菜单栏与工具栏的创建与集成。菜单栏作为应用程序的导航中心,为用户提供了快速访问程序功能的途径;而工具栏则以其直观的操作按钮,进一步简化了用户的操作流程。两者相辅相成,共同构建了应用程序的用户界面骨架。

一、Qt窗口简介

💻**Qt 窗口是通过QMainWindow类来实现的。**

QMainWindow 是 Qt 框架中用于实现主窗口程序的一个核心类,它继承自 QWidget 类,并提供了一个预定义的布局,非常适合构建用户界面的主框架。QMainWindow 包含多个关键组件,这些组件共同构成了一个典型的应用程序窗口界面,如文本编辑器或图片编辑器。这些组件包括:

  • 菜单栏(Menu Bar):位于窗口顶部,用于提供应用程序的主要命令和操作选项。
  • 工具栏(Tool Bars):可选的,位于菜单栏下方,包含了一组快速访问工具按钮,以便用户执行常用操作。
  • 浮动窗口(Dock Widgets):可停靠的窗口部件,如侧边栏或属性面板,提供额外的功能或信息,用户可以自由调整其位置或使其浮动。
  • 状态栏(Status Bar):位于窗口底部,用于显示应用程序的当前状态或提供额外信息给用户。
  • 中心部件(Central Widget):占据主窗口的主要区域,用于显示应用程序的核心内容或用户的主要工作区域。

🎯下图为 QMainWindow 中各组件所处的典型位置示意图:

在这里插入图片描述
这样的布局为开发者提供了一个强大而灵活的基础,以便创建功能丰富、用户友好的应用程序界面,后面我会详细介绍每一个组件。

二、如何在窗口中创建菜单栏

Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有⼀个菜单栏。位于主窗口顶部、主窗口标题栏下面。

菜单栏中包含菜单。菜单中包含菜单项。

在这里插入图片描述

1. 创建菜单栏

菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现。menubar()函数原型如下:

QMenuBar *menuBar() const;

使用方法:

QMenuBar* menuBar = new QMenuBar(this); // 创建菜单栏对象并设置父对象为当前窗口  
this->setMenuBar(menuBar); // 将菜单栏设置到当前窗口中

2. 在菜单栏中添加菜单

使用QMenu类创建一个新的菜单项,并通过该菜单项实例调用addMenu()方法来向其中添加其他菜单作为其子菜单。

// 创建菜单栏  
QMenuBar *menubar = menuBar();  
// 将菜单栏放入窗口中  
this->setMenuBar(menubar);  
// 创建菜单  
QMenu *menu1 = new QMenu("文件");  
QMenu *menu2 = new QMenu("编辑");  
QMenu *menu3 = new QMenu("构建");  
// 添加菜单到菜单栏中  
menubar->addMenu(menu1);  
menubar->addMenu(menu2);  
menubar->addMenu(menu3);

3. 创建菜单项

在Qt中,并没有一个专门的类直接对应于菜单项,但可以通过QAction类来抽象出公共的动作,这些动作可以很容易地被添加到菜单中、工具栏上或是作为快捷键等。因此,在Qt中创建菜单项时,通常会先创建QAction对象来定义菜单项的行为(如触发时执行的槽函数),然后再将这些QAction对象添加到QMenu中,从而实现在菜单中添加菜单项的目的。

// 创建菜单项  
QAction *actl = new QAction("open");  
QAction *act2 = new QAction("close");  
QAction *act3 = new QAction("create");
  
// 将菜单项添加到菜单上  
menu1->addAction(actl);  
menu1->addAction(act2);  
menu1->addAction(act3);

🚨🚨 注意QAction可以给菜单栏使用,也可以给工具栏使用。

4. 在菜单项之间添加分割线

在菜单项之间可以添加分割线以增强可读性,这种分割线是通过QMenu类提供的addSeparator()函数来实现的。

// 创建菜单项  
QAction *act1 = new QAction("open");  
QAction *act2 = new QAction("close");  
QAction *act3 = new QAction("create");  
  
// 将菜单项添加到菜单上  
menu1->addAction(act1);  
menu1->addSeparator(); // 在“open”和“close”中间添加分割线  
menu1->addAction(act2);  
menu1->addAction(act3);

在这里插入图片描述

三、如何在窗口中创建工具栏

工具栏是应用程序中的一个可选区域,用于集成各种功能并通过快捷键快速访问。它的存在并非必须,应用程序可以包含多个工具栏,也可以完全不包含。工具栏是一个灵活可移动的界面组件,其构成元素多样,但通常以图标按钮的形式展现,为用户提供直观的操作界面,如下示意图所示。
在这里插入图片描述

1. 创建工具栏

QMainWindow类中,你可以通过调用addToolBar()函数来创建并添加一个工具栏到主窗口。每当你想要增加一个新的工具栏时,都需要单独调用一次addToolBar()函数。

例如,如果你想要在主窗口中添加两个工具栏,你将需要分别调用addToolBar()函数两次,每次调用都会创建一个新的工具栏并将其添加到主窗口中。

QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(toolBarl);  
this->addToolBar(toolBar2);

2. 设置停靠位置

工具栏的停靠位置设置可以通过两种主要方式来实现,第一种方式是在创建工具栏的同时直接指定其停靠位置,另一种是通过QToolBar类提供的setAllowedAreas()方法设置。

⭕方式⼀:创建工具栏的同时指定其停靠的位置

在创建工具栏的同时,可以通过调用相应的函数来设置工具栏的停靠位置,但如果不特别指定,工具栏的默认位置通常是在窗口的最上方。对于工具栏允许停靠的区域,setAllowedAreas()函数允许开发者定义工具栏可以停靠的窗口区域,包括左侧、右侧、顶部、底部,或者所有这些区域的组合。

  • Qt::LeftToolBarArea:工具栏停靠在窗口的左侧。
  • Qt::RightToolBarArea:工具栏停靠在窗口的右侧。
  • Qt::TopToolBarArea:工具栏停靠在窗口的顶部(默认位置)。
  • Qt::BottomToolBarArea:工具栏停靠在窗口的底部。
  • Qt::AllToolBarAreas:工具栏可以停靠在上述任何一个位置。
QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);
// 创建工具栏的同时,指定工具栏在左侧显示  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
// 创建工具栏的同时,指定工具栏在右侧显示  
this->addToolBar(Qt::RightToolBarArea, toolBar2);

创建工具栏时指定停靠位置则是通过addToolBar()方法的重载版本直接实现,这种方法更加直观和方便,尤其是在初始布局设计阶段。

⭕方式二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

QToolBar *toolBarl = new QToolBar(this);
QToolBar *toolBar2 = new QToolBar(this);
this->addToolBar(toolBarl);
this->addToolBar(toolBar2);
// 只允许在左侧停靠
toolBarl->setAllowedAreas(Qt::LeftToolBarArea);
// 只允许在右侧停靠
toolBar2->setAllowedAreas(Qt::RightToolBarArea);

通过调用QToolBar类的setAllowedAreas()函数来动态设置工具栏可以停靠的区域,这样可以在应用程序运行时根据用户需求或界面布局的变化来灵活调整工具栏的位置。

🚨🚨注意:在创建工具栏的同时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置。

3. 设置浮动属性

工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置。setFloatable()函数的原型为:

void setFloatable(bool floatable);

其中参数floatable用于指定工具栏是否可以浮动:

  • 当参数为true时,表示工具栏可以浮动。
  • 当参数为false时,表示工具栏不可以浮动。
QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
this->addToolBar(Qt::RightToolBarArea, toolBar2);  
toolBarl->setFloatable(true); // 允许工具栏浮动  
toolBar2->setFloatable(false); // 不允许工具栏浮动

4. 设置移动属性

设置工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来实现。setMovable()函数的原型为:

void setMovable(bool movable);

参数:

  • true:允许工具栏移动。
  • false:禁止工具栏移动。

📌 注意:如果工具栏被设置为不可移动状态(即movable参数为false),则任何尝试改变其停靠位置的操作都将不会生效。因此,设置工具栏的移动属性在某种意义上起到了一个总开关的作用,控制着工具栏是否能够被用户重新定位。

QToolBar *toolBarl = new QToolBar(this);  
QToolBar *toolBar2 = new QToolBar(this);  
this->addToolBar(Qt::LeftToolBarArea, toolBarl);  
this->addToolBar(Qt::RightToolBarArea, toolBar2);  
toolBarl->setMovable(true); // 允许移动  
toolBar2->setMovable(false); // 不允许移动

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

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

相关文章

掌握 BM25:深入了解算法及其在 Milvus 中的应用

我们可以通过 Milvus 轻松实现 BM25 算法,将文档和查询转化为稀疏向量。然后,这些稀疏向量可用于向量搜索,根据特定查询找到最相关的文档。 信息检索算法在搜索引擎中非常重要,可确保搜索结果与用户的查询相关。 想象一下&#…

Vue2中watch与Vue3中watch对比和踩坑

上一节说到了 computed计算属性对比 ,虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时&#…

conda环境下在pycharm中调试scrapy项目

前提条件 已经创建好了conda环境已经安装好了scrapy框架项目初始化完成 编写一个爬虫脚本 import scrapyclass StackOverflowSpider(scrapy.Spider):name stackoverflowstart_urls [http://stackoverflow.com/questions?sortvotes]def parse(self, response):print("…

阿一网络安全实战演练之利用 REST URL 中的服务器端参数污染

所需知识 要解决这个实验室问题,您需要了解以下内容: 如何确定用户输入是否包含在服务器端的 URL 路径或查询字符串中。如何使用路径遍历序列尝试更改服务器端请求。如何查找 API 文档。 这些内容在我们的 API 测试学院主题中有涵盖。 进入实验室 研…

终极解决CondaValueError: Malformed version string ‘~’: invalid character(s)问题

conda 创建环境时出现: Solving environment: failed CondaValueError: Malformed version string ‘~’: invalid character(s)以下两种方法都不行时: 原因一: 添加的镜像源中,清华镜像源是https(错误)&a…

软件测试 - 测试分类(静态测试、动态测试、白盒测试、黑盒测试、灰盒测试、单元测试、集成测试、系统测试、验收测试等)

一、为什么要对软件测试进⾏分类? 软件测试是软件⽣命周期中的⼀个重要环节,具有较⾼的复杂性,对于软件测试,可以从不同的⻆度 加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理…

R语言管道操作详解-高效编程

引言 R语言是一种广泛应用于统计分析和图形表示的编程语言和软件环境。随着数据分析和数据科学的发展,R语言的管道操作符已经成为提高代码可读性和效率的重要工具。本文将详细介绍R语言中的管道操作符,包括它们的用途、语法和一些实用的示例。 目录 引…

手写签名怎么变成电子签名?

教大家一个快速生成有效电子签名的方法!(有效电子签名即通过正轨平台绑定了CA数字证书、防伪防盗的签名) 1.登录【微签】,点击【自己签】。 2.点【添加文件】,上传需要签名的电子文件(格式不限)…

一起学习LeetCode热题100道(46/100)

46.二叉树展开为链表(学习) 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历…

Affine Transformations仿射变换

什么是仿射变换 仿射变换(Affine Transformation)是数学和计算机图形学中的一种线性变换,它包括了平移、旋转、缩放、剪切等操作。仿射变换保留了几何图形的“仿射性质”,即平行线在变换后仍然平行,线性组合在变换后仍…

电机预测性维护模组

设备简介 本模组为了对电机进行预测性运维而开发,可以采集电机的 3 路加速度振动传感器、3 路电流(电机供电互感器输出信号)、1 路转速(电机转速)、8 路温度(PT100 温度传感器)。 模组计算振动…

一文带你看懂安全生产管理系统

通过集成多种先进技术和设备,实现对企业安全生产全过程的智能化、精细化管理。系统分为五个核心层面,各层面相互协作,共同确保企业的安全生产。 1. 数据采集层 设备终端:利用防爆终端、防爆平板、无线传感器、电子标签、定位设备、…

WinForm DataGridView整行选中并且checkbox勾选

WinForm DataGridView选中行设置 文章目录 WinForm DataGridView选中行设置添加checkbox列列和选中行效果选中行代码 添加checkbox列 列和选中行效果 选中行代码 public Basic_configuration(){InitializeComponent();...........//添加鼠标事件this.dataGridView_basic.CellMo…

node.js: mssql2019 sequelize6 es6+ ORM in vscode and WebStorm 2023.1

mssql: insert into [dbo].[tutorials]([title],[description],[published],[createdAt],[updatedAt]) values(N涂聚文,N涂聚文,0,2025-05-04,2025-05-04); go insert into [dbo].[tutorials]([title],[description],[published],[createdAt],[updatedAt]) values(Ngeovindu,N…

实战OpenCV之图像的属性

基础入门 图像的属性指的是描述图像基本信息的数据,包括但不限于:图像的尺寸、颜色通道数、像素数据类型等。这些属性对于图像处理非常重要,因为它们直接关系到如何正确地读取、处理和存储图像。常见的图像属性包括: 尺寸&#xf…

WandB 简明教程【Weights Bias】

在机器学习实验领域,调整超参数类似于微调复杂机器的旋钮和刻度盘。这些参数通常很微妙但至关重要,能够显著影响我们模型的性能和行为。WandB(权重和偏差 ) 是一个强大的在线工具集,旨在简化模型训练、评估和分析的过程。 随着我…

TCP shutdown 之后~

目录 摘要 1 API 2 shutdown(sockfd, SHUT_WR) 3 shutdown(sockfd, SHUT_WR) 4 kernel 是怎么做的? 附 摘要 通过 shutdown() 关闭读写操作,会发生什么?具体点呢,考虑两个场景: 场景一:C 发送数据完毕…

VBA技术资料MF184:图片导入Word添加说明文字设置格式

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

C ++初阶:C++入门级知识点

🍺0.前言 言C之言,聊C之识,以C会友,共向远方。各位博友的各位你们好啊,这里是持续分享C知识的小赵同学,今天要分享的C知识是C入门知识点,在这一章,小赵将会向大家展开聊聊C入门知识…

基于Mediapipe的手势识别系统 | OpenCV | Mediapipe | C++ | QT | Python | C# | Unity

基于Mediapipe的手势识别系统 OpenCV、Mediapipe C (QT)、Python (PyCharm)、C# (Visual Studio) Unity 3D 登录界面 图片手势识别 视频文件手势识别 摄像头实时手势识别 演示视频 基于Mediapipe的手势识别系统