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博客 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch分布式一致性原理剖析(二)-Meta篇

Elasticsearch分布式一致性原理剖析(二)-Meta篇 - 知乎 本文首发于云栖社区(Elasticsearch分布式一致性原理剖析(二)-Meta篇-博客-云栖社区-阿里云 )&#xff0c;由原作者转载。 前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行…

DAY07_SpringBoot—用法整合MyBatis

目录 1 SpringBoot 用法1.1 环境切换1.1.1 业务需求1.1.2 多环境编辑 1.2 热部署1.2.1 需求说明1.2.2 引入jar包1.2.3 配置IDEA环境 2 SpringBoot整合Mybatis2.1 导入数据库2.2 创建SpringBoot项目2.2.1 创建项目2.2.2 生成POM.xml文件如下2.2.3 Mavenjar包作用范围2.2.4 数据源…

【JavaWeb】日程管理系统 项目搭建 第二期

文章目录 一、数据库准备二、导入依赖 与 JDBC工具类三、pojo包处理四、daodao包工具类 五、service六、controllerservlet 基类 反射 七、加密工具类 MD5八、页面文件九、业务代码9.1 注册业务处理9.2 登录业务处理 总结 一、数据库准备 创建数据库&#xff1a; SET NAMES …

python-自动篇-办公-用Excel画画

文章目录 代码所遇问题ModuleNotFoundError: No module named xlsxwriterFileNotFoundError: [Errno 2] No such file or directory: 111.jpg 效果附件图片excel 代码 # coding: utf-8from PIL import Image from xlsxwriter.workbook import Workbookclass ExcelPicture(obje…

风二西CTF流量题大集合-刷题笔记|NSSCTF流量题(2)

21.[SUCTF 2018 招新赛]follow me SUCTF{password_is_not_weak} 22.[MoeCTF 2022]usb moectf{Learned_a6ou7_USB_trffic} 23.[黑盾杯 2020]Blue flag{Gre4t_j0B_ON_This_Blue_sh4rk} 24.[蓝帽杯 2022 初赛]domainhacker2 提交发现&#xff0c;07ab403ab740c1540c378b0f5aaa4…

vue(vue2)使用svg格式图标

先安装插件 配置svg文件夹&#xff0c;新建icons文件&#xff0c;svg文件夹放svg后缀文件 index.js文件中的配置 import Vue from "vue" import svgIcon from "/common/iconSvg/index.vue"Vue.component(svg-icon,svgIcon) //挂载全局组件//下面…

深入浅出AI落地应用分析:AI音乐生成之「Suno.ai」

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 本节主要介绍和体验AI音乐生成应用产品Suno AI&#xff0c;Suno来自目前最…

【 CSS 】定位

不要因为小小的失败而放弃大大的梦想&#xff0c;每一次坚持都是通向成功的一步。- 马克吐温 1. 定位 1.1 为何使用定位 我们先来看一个效果&#xff0c;同时思考一下用标准流或浮动能否实现类似的效果&#xff1f; 场景1: 某个元素可以自由的在一个盒子内移动位置&#xff0c…

【MySQL数据库】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 MySQL数据库 &#xff08;一&#xff09;.CentOS 7 安装配置MySQL

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

win10系统 pdf 文件无法正常预览

网上也看了不少办法&#xff0c;修改注册表什么的&#xff0c;太麻烦了&#xff0c;尝试了一下下载Adobe Acrobat Reader&#xff0c;安装后就可以成功预览显示啦&#xff01;对&#xff0c;就是这么简单&#xff01;Adobe Acrobat Reader下载链接&#xff1a;link

【每日一题】2.LeetCode——删除有序数组中的重复项

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

性能优化-OpenCL运行时API介绍

「发表于知乎专栏《移动端算法优化》」 本文首先给出 OpenCL 运行时 API 的整体编程流程图&#xff0c;然后针对每一步介绍使用的运行时 API&#xff0c;讲解 API 参数&#xff0c;并给出编程运行实例。总结运行时 API 使用的注意事项。最后展示基于 OpenCL 的图像转置代码。在…

CSS 蜡烛效果

<template><view class="holder"><!-- 身子 --><view class="candle"><!-- 光源 --><view class="blinking-glow"></view><!-- 火星子 --><view class="thread"></view>…

Unity 建造者模式(实例详解)

文章目录 说明实例1&#xff1a;构建游戏角色实例2&#xff1a;构建游戏场景实例3&#xff1a;构建UI界面 说明 在Unity中&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过分离对象构建过程的复杂性&#xff0c;允许您以…

JAVA 学习 面试(二)多线程篇

Java多线程 线程池 线程池原理 创建方式&#xff1a;newFixedThreadPool (固定数目线程的线程池)、newCachedThreadPool(可缓存线程的线程池)、newSingleThreadExecutor(单线程的线程池)、newScheduledThreadPool(定时及周期执行的线程池)、new ThreadPoolExecutor() &#x…

windows 11安装VMware 17 ,VMware安装Ubuntu 20.4

一、下载安装激活VMware 17 下载与激活&#xff1a;Vmware 17 下载地址、最新激活码 2024 _ 注意&#xff1a;安装路径自己选择&#xff0c;路径中尽可能避免中文或空格 二、下载Ubuntu 镜像 下载镜像地址&#xff1a;清华大学开源软件镜像站 点开下载镜像地址&#xff0c;找…

[docker] 关于docker的面试题

docker命名空间 docker与虚拟机的区别 容器虚拟机所有容器共享宿主机的内核每个虚拟机都有独立的操作系统和内核通过namespace实现资源隔离&#xff0c;通过cgroup实现限制资源的最大使用量完全隔离。每个虚拟机都有独立的硬件资源秒级启动速度分钟级启动速度容器相当于宿主机…

如何测试你的 Golang 代码

文章目录 简单概述最易想到的方法一个快速体验案例学会使用 go testing测试的编写规则灵活记忆 API 的使用 实践一个案例简洁紧凑的表组测试详细的日志输出灵活控制运行哪些测试总结参考 不论是开源项目&#xff0c;还是日常程序的开发&#xff0c;测试都是必不可少的一个环节。…

软件测试Fiddler手机抓包iPhone

Fiddler不但可以截获各种浏览器发出的HTTP/HTTPS请求&#xff0c;也可以截获各种移动设备&#xff0c;发出的HTTP/HTTPS请求。最关键的是&#xff0c;Fiddler还可以断点调试&#xff0c;修改Request和Response&#xff0c;而且即便抓包的是IOS设备&#xff0c;这些操作也可以直…