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

news2024/11/26 0:44:20

目录

一.菜单栏

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.coloradmin.cn/o/1405370.html

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

相关文章

Unity - 简单音频视频

“Test_04” 音频 使用AudioTest脚本控制Audio Source组件&#xff0c;在脚本中声明"music"和"se"之后&#xff0c;在unity中需要将音频资源拖拽到对应位置。 AudioTest public class AudioTest : MonoBehaviour {// 声明音频// AudioClippublic AudioC…

Raspbian安装云台

Raspbian安装云台 1. 源由2. 选型3. 组装4. 调试4.1 python3-print问题4.2 python函数入参类型错误4.3 缺少mjpg-streamer可执行文件4.4 缺失编译头文件和库4.5 python库缺失4.6 图像无法显示&#xff0c;但libcamera-jpeg测试正常4.7 异常IOCTL报错4.8 Git问题 5. 效果5.1 WEB…

CSS文本外观属性内容(知识点1)

知识引入 使用HTML可以对文本外观进行简单的控制&#xff0c;但是效果并不理想&#xff0c;为此CSS提供了一系列的文本外观样式属性&#xff0c;具体如下。 color:文本颜色 color属性用于定义文本的颜色&#xff0c;其取值方式有以下三种。 &#xff08;1&#xff09;预定义…

springboot中一些注解

springboot中一些注解 1:项目启动时会去扫描启动的注解&#xff0c;一般是启动时就想要被加载的方法&#xff1a; 2:springBoot中MSApplication启动类的一些其他注解&#xff1a; EnableAsync&#xff1a;这是一个Spring框架的注解&#xff0c;它用于开启方法异步调用的功能。当…

RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

Linux 一键部署influxd2-telegraf

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

Docker容器引擎(1)

目录 一.Docker 概述 为什么要用到容器&#xff1f; docker是什么&#xff1f; 容器与虚拟机的区别&#xff1f; docker的三个核心概念&#xff1a; 二.安装docker 安装依赖包&#xff1a; 安装 Docker-CE并设置为开机自动启动&#xff1a; 查看 docker 版本信息&#…

制作高端的电子杂志神器推荐

根据市场调查数据显示&#xff0c;越来越多的消费者开始青睐电子杂志这种阅读方式。相比传统纸质杂志&#xff0c;电子杂志具有更高的阅读体验、更便捷的分享和传播方式以及更环保的阅读方式。此外&#xff0c;越来越多的企业也开始重视电子杂志的宣传作用&#xff0c;将其作为…

植物神经功能紊乱到底是什么疾病?今天来告诉你原因和治疗方法!

首先&#xff0c;什么是植物神经功能紊乱&#xff1f;简单来说&#xff0c;植物神经是自主神经系统的一部分&#xff0c;它控制着自主生理反应&#xff0c;比如呼吸、心跳、血压、消化系统等。当这个系统出现紊乱时&#xff0c;就会导致植物神经功能紊乱。咨询&#xff1a;tdhy…

Unity中URP下的 额外灯 逐像素光 和 逐顶点光

文章目录 前言一、额外灯 的 逐像素灯 和 逐顶点灯1、存在额外灯的逐像素灯2、存在额外灯的逐顶点灯 二、测试这两个宏的作用1、额外灯的逐像素灯2、额外灯的逐顶点灯 前言 在之前的文章中&#xff0c;我们了解了 主光相关的反射计算。 Unity中URP下的SimpleLit的 Lambert漫反…

eNSP学习——VLAN基础配置及Access接口

目录 原理概述 实验内容&#xff1a; 实验目的&#xff1a; 实验步骤&#xff1a; 实验拓扑 配置过程 实验编址 基本配置 创建vlan 配置Access接口 原理概述 早期的局域网技术是基于总线型结构的。总线型拓扑结构是由一根单电缆连接所有主机&#xff0c;就导致所…

[SS]语义分割_转置卷积

转置卷积&#xff08;Transposed Convolution&#xff09; 抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09; 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积&#xff08;Transposed Convolution&#xff09;&#xf…

如何使用宝塔面板搭建Discuz论坛服务并结合内网穿透远程访问

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

大模型的高效训练和部署技术卷出新高度

01 大模型训练的挑战 1. 大模型发展现状及问题 上图中展示了大模型的发展历程&#xff0c;其中纵坐标是 AI 模型的参数量。在过去几年间&#xff0c;AI 大模型的参数量飞速增长&#xff0c;大约每 18 个月时间就会增长 40 倍。例如 2016 年&#xff0c;世界最好的大模型 ResNe…

Leetcode—39.组合总和【中等】

2023每日刷题&#xff08;七十六&#xff09; Leetcode—39.组合总和 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int>…

聚道云软件连接器实现航信与用友NC凭证对接,助力企业实现数字化转型

客户介绍&#xff1a; 某自然资源产业集团有限公司是一家专注于自然资源产业的领军企业。自成立以来&#xff0c;该企业始终致力于矿产资源、土地整理和生态修复等领域的业务发展。该企业凭借其卓越的业绩和良好的社会声誉&#xff0c;赢得了广泛的认可与赞誉。 客户痛点&…

burp靶场--host攻击

burp靶场–host攻击 https://portswigger.net/web-security/host-header#what-is-an-http-host-header-attack 在本节中&#xff0c;我们将讨论错误配置和有缺陷的业务逻辑如何通过 HTTP 主机标头使网站遭受各种攻击。我们将概述用于识别易受 HTTP 主机标头攻击的网站的高级方…

Redis+lua 解决秒杀超卖问题

商品超卖的原因是在高并发场景下,业务层面扣库存和库存的判断会出现并发情况&#xff0c;但是使用lua 脚本&#xff0c;就会避免超卖的发生。 1.在项目resources文件夹创建一个名为 stock.lua的脚本 if (redis.call(hexists, KEYS[1], KEYS[2]) 1) thenlocal stock tonumber…

方法(java)

方法&#xff08;method&#xff09;是程序中最小的执行单元 实际开发中&#xff0c;重复的代码、具有独立功能的代码可以抽取到方法中 实际开发中&#xff0c;方法的好处&#xff1a; 1.可以提高代码的复用性 2.可以提高代码的可维护性 方法定义&#xff1a;把一些代码打…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址&#xff1a;https://bz.zzzmh.cn/index逆向接口一&#xff1a;https://api.zzzmh.cn/bz/v3/getData逆向接口二&#xff1a;https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…