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.mzph.cn/news/642817.shtml

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

相关文章

iptables命令详解

简介 iptables 是 Linux 系统中用于配置 IPv4 数据包过滤规则的工具。它是 Linux 内核中 Netfilter 框架的一部分&#xff0c;通过设置规则&#xff0c;可以实现网络包的过滤、NAT 转发、端口映射等功能。 基本概念 表&#xff08;Tables&#xff09;&#xff1a; filter 表…

GPU与SSD间的P2P DMA访问机制

基于PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;总线连接CPU、独立GPU和NVMe SSD的系统架构。 在该架构中&#xff0c;PCIe Swicth支持GPU与SSD之间快速的点对点直接内存访问&#xff08;peer-to-peer, p2p DMA&#xff09;。通常情况下&#xff0…

Qt-QFileDialog保存文件及获取带扩展名的文件名

正确用法 QFileDialog dialog(this, "Save File", QDir::currentPath(), "Text Files (.txt)"); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setDefaultSuffix("txt"); // << if (!dialog.exec())return; QString fileName …

latex添加图片以及引用的实例教程

原理 在 LaTeX 中插入图片&#xff0c;通常是使用 \includegraphics 命令&#xff0c;它是由 graphicx 包提供的。首先&#xff0c;确保在文档的前言部分&#xff08;\documentclass 之后和 \begin{document} 之前&#xff09;包含了 graphicx 包。 下面是一个基本的例子来展…

全志D1-H芯片Tengine支持

简介 ​ Tengine 是 OPEN AI LAB 推出的边缘 AI 计算框架&#xff0c;致力于解决 AIoT 产业链碎片化问题&#xff0c;加速 AI 产业化落地。Tengine 为了解决 AIoT 应用落地问题&#xff0c;重点关注嵌入式设备上的边缘 AI 计算推理&#xff0c;为海量 AIoT 应用和设备提供高性…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染&#xff08;模板引擎&#xff09; 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}&#xff08;三元运算&#xff09; 4. {{做简单 js 判断}} 注意&#xff1a;不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

[小程序]页面的构建

一、视图容器组件 ①View 视图区域组件&#xff0c;类似于HTML中的div&#xff0c;可以用来按块实现页面布局效果&#xff0c;具体实例如下&#xff1a; <view class"dock"><view>A</view><view>B</view><view>C</view> &…

常用界面设计组件 —— 按钮组件、布局组件

2.4 按钮组件2.5 布局组件 2.4 按钮组件 QPushButton、QRadioButton 、QCheckBox都从 QAbstractButton&#xff0c;拥有一些共同的属性&#xff0c;如下图所 示&#xff1a; 图标使用setIcon()来设置&#xff0c;文本可以在构造函数或通过 setText()来设置。 可以使用 isCheck…

查看并解析当前jdk的垃圾收集器

概述&#xff1a;复习的时候&#xff0c;学看一下。 命令&#xff1a; -XX:PrintCommandLineFlags 打开idea&#xff0c;配置jvm 把上面命令输入jvm options中即可。 举例代码 这个代码的解析&#xff0c;我上篇文章有写&#xff0c;这个跟本文没有任何关系&#xff1a; …

C++--enum--枚举

C/C枚举类型&#xff1a; 不限定作用域的枚举类型 关键字&#xff1a;enum 声明枚举类型&#xff0c;然后可以用枚举类型来定义变量(如同结构体)&#xff1a; enum Color{white,black,yellow}; {注意分号} Color color_type; color_type 变量的值只限于枚举类型Color中的值 枚…

深度学习|RCNNFast-RCNN

1.RCNN 2014年提出R-CNN网络&#xff0c;该网络不再使用暴力穷举的方法&#xff0c;而是使用候选区域方法&#xff08;region proposal method&#xff09;创建目标检测的区域来完成目标检测的任务&#xff0c;R-CNN是以深度神经网络为基础的目标检测的模型 &#xff0c;以R-C…

Hikvision综合安防管理平台files;.css接口存在任意文件读取漏洞 附POC软件

免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Hikvisi…

设计模式——1_6 代理(Proxy)

诗有可解不可解&#xff0c;若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子&#xff1a;图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理&#xff1a;镜中月&#xff0c;水中花保护代理&#xff1a;对象也该有隐私引用代理&#xff1a;…

Jupyter Notebook安装使用教程

Jupyter Notebook 是一个基于网页的交互式计算环境&#xff0c;允许你创建和共享包含代码、文本说明、图表和可视化结果的文档。它支持多种编程语言&#xff0c;包括 Python、R、Julia 等。其应用场景非常广泛&#xff0c;特别适用于数据科学、机器学习和教育领域。它可以用于数…

vue element MessageBox.prompt this.$prompt组件禁止显示右上角关闭按钮,取消按钮,及点击遮罩层关闭

vue element MessageBox.prompt this.$prompt组件禁止或取消显示右上角关闭按钮&#xff0c;取消按钮&#xff0c;及点击遮罩层关闭 实现效果&#xff1a; 实现代码 MessageBox.prompt(请先完成手机号绑定, 系统提示, {confirmButtonText: 提 交,showClose: false,closeOnClic…

linux之安装配置VM+CentOS7+换源

文章目录 一、centos07安装二、CentOS 07网络配置2.1解决CentOS 07网络名不出现问题此博主的论文可以解决2.2配置&#xff08;命令: 【ip a】也可查看ip地址&#xff09; 三、使用链接工具链接CentOS进行命令控制四、换软件源 一、centos07安装 1、在vmvare中新建虚拟机 2、下…

Linux:动静态库的概念与制作使用

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 本篇要谈论的内容是关于动静态库的问题&#xff0c;具体的逻辑框架是建立在库的制作&#xff0c;库的使用&…

mysql INSERT数据覆盖现有元素(若存在)

INSERT...ON DUPLICATE KEY UPDATE的使用 如果指定了ON DUPLICATE KEY UPDATE&#xff0c;并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值&#xff0c;则会更新ON DUPLICATE KEY UPDATE关键字后面的字段值。 例如&#xff0c;如果列a被定义为UNIQUE&#xff0…

不要为了学习而学习

经常有朋友问我&#xff1a; 老师&#xff0c;从您这里学了很多方法&#xff0c;也一直想要改变自己&#xff0c;但总是没办法坚持下去&#xff0c;怎么办&#xff1f; 这个问题&#xff0c;我也很无奈啊。毕竟我也没办法飞到你身边&#xff0c;手把手把每一步都教给你。&…

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

大开眼界&#xff1f;探索多模态模型种视觉编码器的缺陷。 论文中指出&#xff0c;上面这些VQA问题&#xff0c;人类可以瞬间给出正确的答案&#xff0c;但是多模态给出的结果却是错误的。是哪个环节出了问题呢&#xff1f;视觉编码器的问题&#xff1f;大语言模型出现了幻觉&…