Qt6入门教程 10:菜单栏、工具栏和状态栏

目录

一.菜单栏

1.Qt Designer

1.1添加菜单和菜单项

1.2添加二级菜单

1.3给菜单和菜单项添加图标

1.4给菜单项添加功能

2.纯手写

二.工具栏

1.Qt Designer

1.1添加工具栏按钮

1.2工具栏的几个重要属性

2.纯手写

三.状态栏

1.Qt Designer

2.纯手写


用Qt Creator新建基于QMainWindow的项目时,会自带菜单栏和状态栏。还是以前面的HelloWorld项目为例,通过Qt Designer和纯手写两种方式来添加或移除菜单栏、工具栏和状态栏。

一.菜单栏

1.Qt Designer

菜单栏、工具栏和状态栏都可以通过右键快捷菜单添加或移除。下面以工具栏为例。
添加一个工具栏

移除一个工具栏

1.1添加菜单和菜单项

双击,输入,并回车,即可添加一个菜单。

这里先菜单Edit,点击菜单Edit可以添加菜单项和分隔符,

添加菜单项的方法也是双击,输入,并回车。这里添加了两个一级菜单项Color和Font。

如果要在Color和Font之间添加一个分隔符,有两种方法,一是双击“添加分隔符”,此时分隔符默认添加到最后一个菜单项的后面,也就是font的后面,可以用鼠标选中这个分隔符并拖到color和font之间;二是选中Font,右键插入分隔符,此时分隔符插入到Font的前面面,也就是Color和Font之间。菜单项和分隔符都可以右键移除。

1.2添加二级菜单

点击一级菜单项右边的“+”可以添加二级菜单,重复操作能添加N级菜单。

添加好二级菜单后如下图所示。

1.3给菜单和菜单项添加图标

这里给Color菜单和Red菜单项添加图标。下图是给Color菜单添加图标的步骤,给Red菜单项添加图标的步骤一样。

运行一下:

当然也可以双击“Action编辑器”中的某一行来编辑Action属性。

比如说双击actionRed所在行。

1.4给菜单项添加功能

在mainwindow.cpp的构造函数中添加:

#include <QPalette>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->actionRed, &QAction::triggered, this, [this]{QPalette palette ;palette .setColor(QPalette::WindowText, Qt::red);ui->label->setAutoFillBackground(true);ui->label->setPalette(palette);});
}

运行一下:

2.纯手写

先右键移除菜单栏

然后在mainwindow.cpp的构造函数中添加:

#include <QPalette>
#include <QMenuBar>
#include <QMenu>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 添加菜单栏.QMenuBar *menuBar = new QMenuBar(this);setMenuBar(menuBar);// 添加Edit菜单.QMenu *editMenu = new QMenu("Edit", this);menuBar->addMenu(editMenu);// 添加Color二级菜单和菜单项.QMenu *colorMenu = new QMenu("Color", this);colorMenu->setIcon(QIcon(":/icons/AppIcon.ico"));QAction *redAction = new QAction(QIcon(":/icons/AppIcon.ico"), "Red", this);QAction *greenAction = new QAction("Green", this);QAction *blueAction = new QAction("Blue", this);colorMenu->addAction(redAction);colorMenu->addAction(greenAction);colorMenu->addAction(blueAction);editMenu->addMenu(colorMenu);// 添加分隔符.editMenu->addSeparator();// 添加Font二级菜单和菜单项.QMenu *fontMenu = new QMenu("Font", this);QAction *microsoftYaHeiAction = new QAction("Microsoft YaHei", this);QAction *timesNewRomanAction = new QAction("Times New Roman", this);QAction *arialAction = new QAction("Arial", this);fontMenu->addAction(microsoftYaHeiAction);fontMenu->addAction(timesNewRomanAction);fontMenu->addAction(arialAction);editMenu->addMenu(fontMenu);connect(redAction, &QAction::triggered, this, [this]{QPalette palette ;palette .setColor(QPalette::WindowText, Qt::red);ui->label->setAutoFillBackground(true);ui->label->setPalette(palette);});
}

运行效果一样。

二.工具栏

1.Qt Designer

1.1添加工具栏按钮

这里得先介绍一下QAction,Qt使用QAction类作为动作。顾名思义,这个类就是代表了窗口的一个“动作”,这个动作可能显示在菜单,作为一个菜单项,当用户点击该菜单项,对用户的点击做出响应;也可能在工具栏,作为一个工具栏按钮,用户点击这个按钮就可以执行相应的操作。有一点值得注意:无论是出现在菜单栏还是工具栏,用户选择之后,所执行的动作应该都是一样的。因此,Qt并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
QAction包含了图标、菜单文字、快捷键、状态栏文字、悬浮提示等信息。当把一个QAction对象添加到程序中时,Qt自己选择使用哪个属性来显示,无需我们关心。同时,Qt能够保证把QAction对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了QAction的图标,那么在工具栏上面这个QAction所对应的按钮的图标也会同步修改。

运行一下:

1.2工具栏的几个重要属性


●moveable:标识工具栏是否可以移动,默认勾选,此时工具栏左侧有一列点点。如果取消勾选,那一列点点就没了,当然工具栏也无法移动。
●allowedAreas:标识工具栏能停靠的位置,默认上下左右都可以停靠,如下图所示:

●orientation:标识工具栏的方向,水平还是垂直,默认为Qt::Horizontal。需要注意的是当工具栏被QMainWIndow管理时,这个属性不起作用。如果你需要一个垂直的工具栏,可以调用QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar),用第一个参数来指定停靠位置,停靠到窗口的左边或右边,就自动变成垂直的了。
●iconSize:标识工具栏按钮图片的大小,工具栏的高度会随着图片大小变化。
●toolButtonStyle:标识工具栏按钮的样式,默认为ToolButtonIconOnly,如果选择ToolButtonTextUnderIcon,就会在图标的下方显示按钮名字。


●floatable:是否允许工具条独立于窗口,默认勾选。如果取消勾选,工具栏拖出窗口后释放鼠标,它会自动回到窗口中。

2.纯手写

先右键移除工具栏

然后在mainwindow.cpp的构造函数中添加:

#include <QPalette>
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 添加菜单栏.QMenuBar *menuBar = new QMenuBar(this);setMenuBar(menuBar);// 添加Edit菜单.QMenu *editMenu = new QMenu("Edit", this);menuBar->addMenu(editMenu);// 添加Color二级菜单和菜单项.QMenu *colorMenu = new QMenu("Color", this);colorMenu->setIcon(QIcon(":/icons/AppIcon.ico"));QAction *redAction = new QAction(QIcon(":/icons/AppIcon.ico"), "Red", this);QAction *greenAction = new QAction("Green", this);QAction *blueAction = new QAction("Blue", this);colorMenu->addAction(redAction);colorMenu->addAction(greenAction);colorMenu->addAction(blueAction);editMenu->addMenu(colorMenu);// 添加分隔符.editMenu->addSeparator();// 添加Font二级菜单和菜单项.QMenu *fontMenu = new QMenu("Font", this);QAction *microsoftYaHeiAction = new QAction("Microsoft YaHei", this);QAction *timesNewRomanAction = new QAction("Times New Roman", this);QAction *arialAction = new QAction("Arial", this);fontMenu->addAction(microsoftYaHeiAction);fontMenu->addAction(timesNewRomanAction);fontMenu->addAction(arialAction);editMenu->addMenu(fontMenu);// 添加工具栏.QToolBar *toolBar = new QToolBar(this);// 指定停靠位置,如果第一个参数为Qt::LeftToolBarArea,就是停靠在左边的垂直工具栏.addToolBar(Qt::TopToolBarArea, toolBar);toolBar->setFloatable(true);// 设置允许浮动.toolBar->setMovable(true);  // 设置允许移动.toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);// 设置工具栏按钮只有图片.// 添加工具栏按钮.toolBar->addAction(redAction);toolBar->addAction(greenAction);toolBar->addAction(blueAction);// 添加分隔符.toolBar->addSeparator();toolBar->addAction(microsoftYaHeiAction);connect(redAction, &QAction::triggered, this, [this]{QPalette palette ;palette .setColor(QPalette::WindowText, Qt::red);ui->label->setAutoFillBackground(true);ui->label->setPalette(palette);});
}

运行效果一样。

三.状态栏

1.Qt Designer

在Qt Designer能设置的状态栏属性只有sizeGripEnabled,关于sizeGrip在上一篇中已经介绍,这里不再赘述。

因此状态栏中显示的信息得用代码才能添加。

2.纯手写

状态栏显示信息的类型一般分为3种
●普通信息,文本显示在状态栏的最左边,会被临时信息覆盖,可用于显示页码、行数等信息。     
void addWidget(QWidget *widget, int stretch = 0);
●永久信息,文本会一直显示在状态栏的最右边,可用于显示键盘是否大写锁定(Caps Lock)。
void addPermanentWidget(QWidget *widget, int stretch = 0);
●临时信息,文本显示在状态栏的最左边,指定信息显示多久,时间一到信息消失,以毫秒为单位。
void showMessage(const QString &text, int timeout = 0);
需要注意的是,timeout的默认值为0,此时消息会一直显示直到调用clearMesssage()或者再次调用showMessage()为止。
先右键移除状态栏

然后在mainwindow.cpp的构造函数中添加:

#include <QPalette>
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QStatusBar>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 添加菜单栏.QMenuBar *menuBar = new QMenuBar(this);setMenuBar(menuBar);// 添加Edit菜单.QMenu *editMenu = new QMenu("Edit", this);menuBar->addMenu(editMenu);// 添加Color二级菜单和菜单项.QMenu *colorMenu = new QMenu("Color", this);colorMenu->setIcon(QIcon(":/icons/AppIcon.ico"));QAction *redAction = new QAction(QIcon(":/icons/AppIcon.ico"), "Red", this);QAction *greenAction = new QAction("Green", this);QAction *blueAction = new QAction("Blue", this);colorMenu->addAction(redAction);colorMenu->addAction(greenAction);colorMenu->addAction(blueAction);editMenu->addMenu(colorMenu);// 添加分隔符.editMenu->addSeparator();// 添加Font二级菜单和菜单项.QMenu *fontMenu = new QMenu("Font", this);QAction *microsoftYaHeiAction = new QAction("Microsoft YaHei", this);QAction *timesNewRomanAction = new QAction("Times New Roman", this);QAction *arialAction = new QAction("Arial", this);fontMenu->addAction(microsoftYaHeiAction);fontMenu->addAction(timesNewRomanAction);fontMenu->addAction(arialAction);editMenu->addMenu(fontMenu);// 添加工具栏.QToolBar *toolBar = new QToolBar(this);// 指定停靠位置,如果第一个参数为Qt::LeftToolBarArea,就是停靠在左边的垂直工具栏.addToolBar(Qt::TopToolBarArea, toolBar);toolBar->setFloatable(true);// 设置允许浮动.toolBar->setMovable(true);  // 设置允许移动.toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);// 设置工具栏按钮只有图片.// 添加工具栏按钮.toolBar->addAction(redAction);toolBar->addAction(greenAction);toolBar->addAction(blueAction);// 添加分隔符.toolBar->addSeparator();toolBar->addAction(microsoftYaHeiAction);// 添加状态栏.QStatusBar *status = new QStatusBar(this);setStatusBar(status);QLabel *statusLabel = new QLabel("I am statusBar", this);// 状态栏添加信息.status->showMessage("I will disappear in 3 seconds", 3000);status->addPermanentWidget(statusLabel);// 添加到状态栏右侧(永久性).connect(redAction, &QAction::triggered, this, [this]{QPalette palette ;palette .setColor(QPalette::WindowText, Qt::red);ui->label->setAutoFillBackground(true);ui->label->setPalette(palette);});
}

运行一下:

本文并未介绍菜单栏的快捷键操作,后续将用一篇博客专门介绍快捷键。

有些人喜欢用Qt Designer,有些呢喜欢纯手写,那种方式更好就仁者见仁,智者见智了。个人觉得***.ui文件起到了界面设计和逻辑实现分离的作用,而且打字再快也没鼠标拖拽快吧,不过后续文章将以手写代码为主,因为截图太麻烦了。Qt小部件中能用代码设置的属性,在Qt Designer的属性编辑器中大多都能找到对应的设置项。 

原文链接:Qt6入门教程 10:菜单栏、工具栏和状态栏-CSDN博客 

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

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

相关文章

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…

Overleaf(LaTeX文档在线编写平台)使用学习记录

一、LaTeX简概[1] LaTeX&#xff0c;是一种基于TEX的排版系统&#xff0c;是一种可以处理排版和渲染的标记语言。由美国计算机科学家莱斯利兰伯特在20世纪80年代初期开发&#xff0c;利用这种格式系统的处理&#xff0c;即使用户没有排版和程序设计的知识也可以充分发挥由TEX所…

SpringBoot整合ElasticSearch实现基础的CRUD操作

本文来说下SpringBoot整合ES实现CRUD操作 文章目录 概述spring-boot-starter-data-elasticsearch项目搭建ES简单的crud操作保存数据修改数据查看数据删除数据 本文小结 概述 SpringBoot支持两种技术和es交互。一种的jest&#xff0c;还有一种就是SpringData-ElasticSearch。根据…

centos7安装Redis7.2.4

文章目录 下载Redis解压Redis安装gcc依赖&#xff08;Redis是C语言编写的&#xff0c;编译需要&#xff09;编译安装src目录下二进制文件安装到/usr/local/bin修改redis.conf文件启动redis服务外部连接测试 参考&#xff1a; 在centos中安装redis-5.0.7 Memory overcommit must…

docker 部署及命令

一、容器概述 1、为什么要用到容器&#xff1f; ①容器可以屏蔽底层操作系统的差异性&#xff0c;让业务应用不管在哪里都是使用容器的环境运行&#xff0c;从而保证开发测试环境与生产环境的一致性 ②容器部署起来非常便捷和迅速&#xff0c;缩短开发测试部署的周期时间 2…

神经网络的学习(Neural Networks: Learning)

1.代价函数 案例&#xff1a;假设神经网络的训练样本有&#x1d45a;个&#xff0c;每个包含一组输入&#x1d465;和一组输出信号&#x1d466;&#xff0c;&#x1d43f;表示神经网络层数&#xff0c;&#x1d446;&#x1d43c;表示每层的 neuron 个数(&#x1d446;&#…

【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔

项目文件&#xff1b; 【1】 预览 文件 文件01 名称 pom.xml&#xff1b; 内容 &#xff08;01&#xff09;总的 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http:…

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器 点击button按钮触发事件显示月份与获取的时间 Button button3 (Button) findComponentById(ResourceTable.Id_button3);button3.setClickedListener(new Component.ClickedListener() {Overridepublic void onClick(Compon…

【趣味CSS3.0】粘性定位属性Position:sticky是不是真的没用了?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

Webpack5 基本使用 - 2

常用 loader loader 是辅助打包工具。webpack 默认只能打包 js 文件&#xff0c;打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。loader 可以将文件从不同的语言转换为 JavaScript。一类文件如果需要多个 loader 处理&#xff0c;loader 的执行顺序是从…

SQL注入 ---> Day1 !

终于&#xff0c;我的课程开始讲SQL注入了&#xff0c;对就是那个常年在OWASP上有名的SQL注入 今天是真的冷啊&#xff0c;幸苦的小编还在写csdn 1.SQL注入原理 SQl注入其实就是将恶意的代码向服务器提交&#xff0c;但是后端又不过滤而引发的漏洞&#xff0…

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…

让二叉树无处可逃

志不立&#xff0c;天下无可成之事。 ——王阳明 二叉树 1、树&#xff1f;什么是树1、1、基本概念1、2、树的相关概念1、3、树的表示方式1、4、树的实际运用 2、二叉树&#xff1f;只有两个分支吗&#xff1f;2、1、基本概念2、2、二叉树的相关定义2、3、二叉树的相关性质2、4…

flutter获取地理定位:geolocator依赖详细用法

本文使用geolocator插件实现app物理定位功能。 该插件的主要功能有&#xff1a; 获取最后已知位置&#xff1b;获取设备当前位置&#xff1b;获取连续的位置更新&#xff1b;检查设备是否启用了定位服务&#xff1b;计算两个地理坐标之间的距离&#xff08;米&#xff09;&am…

Python基础第九篇(Python可视化的开发)

文章目录 一、json数据格式&#xff08;1&#xff09;.转换案例代码&#xff08;2&#xff09;.读出结果 二、pyecharts模块介绍三、pyecharts模块入门&#xff08;1&#xff09;.pyecharts模块安装&#xff08;2&#xff09;.pyecharts模块操作&#xff08;1&#xff09;.代码…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…

第二证券:大金融板块逆势护盘 北向资金尾盘加速净流入

周一&#xff0c;A股商场低开低走&#xff0c;沪指收盘失守2800点。截至收盘&#xff0c;上证综指跌2.68%&#xff0c;报2756.34点&#xff1b;深证成指跌3.5%&#xff0c;报8479.55点&#xff1b;创业板指跌2.83%&#xff0c;报1666.88点。沪深两市合计成交额7941亿元&#xf…

Django代码中的TypeError ‘float‘ object is not callable

学习使用Django进行网页爬取取决于你对Python、Django框架和网络爬虫的熟悉程度。以下是一些关键点&#xff0c;总的来说&#xff0c;如果你已经具备Python和Django的基础知识&#xff0c;并对网页爬虫有一定了解&#xff0c;那么学习使用Django进行网页爬取将会比较容易。如果…

鸿蒙应用开发学习:获取手机位置信息

一、前言 移动应用中经常需要获取设备的位置信息&#xff0c;因此在鸿蒙应用开发学习中&#xff0c;如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码&#xff0c;于是在百度上搜了一下&#xff0c;可能是我输入的关键字不对&#xff0c;结果没有找到想要…

Bluetooth Device Address(BD_ADDR) - 2

蓝牙核心规范&#xff1a;Core v5.3中关于蓝牙地址的其他说明 Vol 3: Host, Part C: Generic Access Profile 3 User interface aspects 3.2 Representation of Bluetooth parameters 3.2.1 Bluetooth Device Address (BD_ADDR) BD_ADDR 是蓝牙设备使用的地址。在设备发现过…