【Qt】从QMainWindow到UI框架

news2025/1/13 7:58:58

目录

  • 简介
  • UI布局元素
    • Central Widget
    • Menu Bar
    • Toolbars
    • Status Bar
    • Dock Widgets
  • 参考文档

简介

如下图所示,我们常见的一些desktop软件,比如VS Code、Smart VCI等,一般都会包含顶部的菜单栏,底部的状态栏,以及一些其他UI布局元素。
在这里插入图片描述
在这里插入图片描述

新建Qt项目是以MainWindow作为显示的载体,MainWindow是继承自QMainWindow的一个子类。

如下图所示,QMainWindow本身提供了常用的UI布局元素1,包括:

  • Menu Bar 菜单栏
  • Toolbars 工具栏
  • Status Bar 状态栏
  • Dock Widgets Dock栏
  • Central Widget 页面内容区域
    在这里插入图片描述
    合理利用这几种元素,我们就可以构建出我们常见的desktop布局了:
    在这里插入图片描述

接下来我们一次介绍这些元素及其基本使用方法

UI布局元素

Central Widget

Central Widget主要用来显示页面内容,通常是自定义Widget,也就是QWidget的子类,用来展示我们App的主要内容。可以调用QMainWindowsetCentralWidget()方法来设置Central Widget。

Menu Bar

Menu Bar也就是我们常见的菜单栏,在Qt中是用QMenuBar2类创建的。
在介绍QMenuBar之前,需要先介绍另外一个类QAction3。在desktop应用中,经常通过菜单栏中的菜单、工具栏按钮或者快捷键调用一些应用中常用的功能,比如打开文件操作。对于同一个功能,不管通过什么方式调用,执行的命令应该是同一个。这种情况下把功能抽象为Action是非常有用的,在Qt中,就是QAction。也就是说QAction是某个应用功能的抽象,可以同时被添加到菜单栏、工具栏和快捷键,Qt会自动完成在不同地方的状态同步。以下面代码为例:

    // ...
     QAction *submenu4 = new QAction("子菜单四");
     submenu4->setCheckable(true);
     submenu4->setShortcuts(QKeySequence::Copy);
     // ...
     menubar->addAction(submenu4);
     toolbar->addAction(submenu4);

如果在应用中执行“Ctrl + C”, 子菜单四就会被选中,菜单栏、工具栏中的子菜单四状态都会同时发生改变:
在这里插入图片描述

接下来可以开始介绍QMenuBar了,它的功能就是创建菜单栏,容纳QMenu4。通过QMainWinowvoid setMenuBar(QMenuBar *menuBar)5功能添加菜单栏,通过QMenuBaraddMenu6方法为菜单栏添加菜单元素,通过addAction方法添加具体命令。
通过下面例子介绍具体使用:

QMenuBar *menubar = new QMenuBar();
// 创建多级菜单
QMenu *menu1 = new QMenu("菜单一");

QMenu *submenu1 = new QMenu("子菜单一");
QAction *submenu11 = new QAction("二级子菜单一");
QAction *submenu12 = new QAction("二级子菜单二");
submenu1->addAction(submenu11);
submenu1->addAction(submenu12);

QAction *submenu2 = new QAction("子菜单二");
menu1->addMenu(submenu1);
menu1->addAction(submenu2);


// 没有子菜单的一级菜单
QAction *menu2 = new QAction("菜单二");
 menubar->addMenu(menu1);
 menubar->addAction(menu2);

效果如下图
在这里插入图片描述

Toolbars

与菜单栏类似,Qt通过QToolBar7创建工具栏,通过QMainWindowvoid addToolBar(QToolBar *toolbar)8可以为窗口添加工具栏,一个窗口中可以添加多个工具栏。
工具栏元素可以添加QAction也可以添加QWidget,对应添加方法是addAction()addWidget()QMainWindow添加工具栏时可以指定工具栏的默认位置,通过下面的例子介绍具体使用

    QAction *submenu2 = new QAction("子菜单二");
    QAction *submenu3 = new QAction("子菜单三");
    QAction *submenu4 = new QAction("子菜单四");
    QPushButton *btn = new QPushButton("按钮");
    
    QToolBar *toolbar = new QToolBar();
    
    toolbar->addAction(submenu2);
    toolbar->addAction(submenu3);
    toolbar->addSeparator(); // 菜单元素之间增加分割线
    toolbar->addWidget(btn);

    QToolBar *toolbar2 = new QToolBar();
    toolbar2->addAction(submenu4);

    addToolBar(toolbar);
    addToolBar(toolbar2);

效果如图:在这里插入图片描述
菜单栏默认会被添加在窗口上方,菜单栏默认也是可以拖动到窗口的四个边,也可以处于悬浮状态请添加图片描述
对于上述的默认值,可以手动做一些限制和调整:

  • 指定初始位置,在调用addToolBar()时指定位置,比如addToolBar(toolbar, Qt::TopToolBarArea)。位置包括LeftToolBarAreaRightToolBarAreaTopToolBarAreaBottomToolBarArea
  • 是否允许多动,通过QToolBarvoid setMovable(bool movable)
  • 指定可以拖动到的窗口位置,通过QToolBarvoid setAllowedAreas(Qt::ToolBarAreas areas),比如只允许窗口上方或者窗口下方toolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
  • 菜单栏是否可以处于悬浮状态,通过QToolBarvoid setFloatable(bool floatable)

Status Bar

通过QStatusBar9为窗口添加状态栏,位于窗口底部,一般用于显示一些通知和提示。QMainWindowsetStatusBar()函数为窗口设置状态栏。
通过statusBar()->showMessage("Message", 2000);在状态栏显示信息,并支持指定信息存在的时长。

Dock Widgets

相比于QToolBar,Dock Widgets10的内容有更多自由度,一般用于显示一些工作区域,比如文档目录这些。通过QMainWindowaddDockWidget为窗口添加Dock Widget。

和工具栏类似,Dock Widget也可以指定初始位置、是否可以拖动、允许的位置以及是否可以处于悬浮状态等。

同一个窗口同样可以添加多个Dock Widget,多个Widget还可以组合在一起,通过tab切换

通过如下示例说明:

    QDockWidget *dockWidget = new QDockWidget("Dock Widget");
    QLabel *dockWidgetContent = new QLabel("dock Widget内容");
    dockWidgetContent->setStyleSheet("background-color:green;color: white;");
    dockWidget->setWidget(dockWidgetContent);
    addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

    QDockWidget *dockWidget2 = new QDockWidget("Dock Widget 2");
    QLabel *dockWidgetContent2 = new QLabel("dock Widget 2 内容");
    dockWidgetContent2->setStyleSheet("background-color:green;color: white;");
    dockWidget2->setWidget(dockWidgetContent2);
    addDockWidget(Qt::LeftDockWidgetArea, dockWidget2);

    QDockWidget *dockWidget3 = new QDockWidget(tr("Dock Widget 3"));
    dockWidget3->setAllowedAreas(Qt::LeftDockWidgetArea |
                                Qt::RightDockWidgetArea);
    QLabel *dockWidgetContent3 = new QLabel("dock Widget 3 内容");
    dockWidgetContent3->setStyleSheet("background-color:green;color: white;");
    dockWidget3->setWidget(dockWidgetContent3);

    addDockWidget(Qt::LeftDockWidgetArea, dockWidget3);
    tabifyDockWidget(dockWidget, dockWidget2); // 将dockWidget和dockWidget2组合
    tabifyDockWidget(dockWidget, dockWidget3); // 将docketWidget、dockWidget2以及dockWidget3组合在一起

效果如下图:
在这里插入图片描述

请添加图片描述

参考文档


  1. https://doc.qt.io/qt-6/qmainwindow.html#qt-main-window-framework ↩︎

  2. https://doc.qt.io/qt-6/qmenubar.html ↩︎

  3. https://doc.qt.io/qt-6/qaction.html ↩︎

  4. https://doc.qt.io/qt-6/qmenu.html ↩︎

  5. https://doc.qt.io/qt-6/qmainwindow.html#setMenuBar ↩︎

  6. https://doc.qt.io/qt-6/qmenubar.html#addMenu-1 ↩︎

  7. https://doc.qt.io/qt-6/qtoolbar.html ↩︎

  8. https://doc.qt.io/qt-6/qmainwindow.html#addToolBar-1 ↩︎

  9. https://doc.qt.io/qt-6/qstatusbar.html ↩︎

  10. https://doc.qt.io/qt-6/qdockwidget.html#details ↩︎

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

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

相关文章

工业制造领域系统:SCADA、PLC、DCS、MES、HMI、ERP等,一文秒懂

工业制造控制系统在工业制造领域起到了关键的作用,帮助企业提高生产效率、降低成本、提高产品质量和安全性。不同的企业根据自身需求和规模,可能会选择使用其中的一种或多种系统。 SCADA系统(Supervisory Control and Data Acquisition&…

第2章 信息技术基础

本章学习要点 全面了解医院信息系统建设所涉及的主要信息技术以及这些技术的应用情况。 计算机与网络、信息技术与信息系统、数字媒体与数据存储技术、条形码(二维码)、RFID技术、云计算、APP技术 1.XML 可扩展标记语言与Access,Oracle和SQL Server等数据库不同…

什么软件可以剪辑录音?录音剪辑推荐3款工具

随着数字技术的发展,录音已经成为我们日常生活和工作中不可或缺的一部分。无论是会议记录、课堂笔记,还是音乐创作、语音聊天,我们都需要用到录音功能。然而,单纯的录音往往不能满足我们的需求,我们还需要对录音进行剪…

常用芯片学习——TP4057电源管理芯片

TP40578 500mA线性锂离子电池充电器 芯片介绍 TP4057是一款性能优异的单节锂离子电池恒流/恒压线性充电器。TP4057采用S0T23-6封装配合较少的外围原件使其非常适用于便携式产品,并且适合给USB电源以及适配器电源供电。 基于特殊的内部MOSFET架构以及防倒充电路&a…

图像处理与视觉感知---期末复习重点(3)

文章目录 一、空间域和频率域二、傅里叶变换三、频率域图像增强 一、空间域和频率域 1. 空间域:即所说的像素域,在空间域的处理就是在像素级的处理,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱,表示图…

BMP280学习

1.Forced mode模式&#xff0c;单次采集后进入休眠&#xff0c;适用于低采样率。 2.normal mode模式&#xff0c;持续采集&#xff0c;我们使用这种 采集事件基本都是ms级&#xff0c;所以我们1s更新一次。 温度和压力的计算 #include <SPI.h> //定义数据类型 #define s3…

就业班 2401--3.12 Linux Day16 PXE布置——自动化装系统

什么是PXE&#xff1f; PXE&#xff0c;全名Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff1b;通过网络接口启动计算机&#xff0c;不依赖本地存储设备&#xff08;如硬盘&#xff09;或本地已安装的操作系统&#xff1b;由Intel和Systemsoft公司于1999年…

2024/03/15(网络编程·day3)

一、思维导图 二、模拟面试题 什么是IP地址&#xff1f; IP地址是主机在网络中的唯一标识。 分为IPv4和IPv6&#xff0c; IPv4由4字节32位二进制数组成&#xff0c;通常使用点分十进制表示&#xff0c;例如192.168.117.85 &#xff0c;其中每个十进制数的范围都在0-255. IPv6由…

技术资讯:Volar正式更名为Vue-Official

大家好&#xff0c;我是大澈&#xff01; 本文约700字&#xff0c;整篇阅读大约需要1分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包“…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试总结是安全生产模拟考试一点通总题库中生成的一套广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;模拟试题&#xff0c;…

ArrayBlockingQueue与LinkedBlockingQueue底层原理

ArrayBlockingQueue与LinkedBlockingQueue底层原理 在线程池中&#xff0c;等待队列采用ArrayBlockingQueue或者LinkedBlockingDeque&#xff0c;那他们是怎么实现存放线程、阻塞、取出的呢&#xff1f; 一、ArrayBlockingQueue底层原理 1.1 简介 ArrayBlockingQueue是一个阻塞…

[嵌入式AI从0开始到入土]16_ffmpeg_ascend编译安装及性能测试

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

力扣题目训练(21)

2024年2月14日力扣题目训练 2024年2月14日力扣题目训练605. 种花问题617. 合并二叉树628. 三个数的最大乘积289. 生命游戏299. 猜数字游戏149. 直线上最多的点数 2024年2月14日力扣题目训练 2024年2月14日第二十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…

2.2 HTML5保留的常用标签

2.2.1 基础标签 1. 段落标签<p> 段落标签<p>和</p>用于形成一个新的段落&#xff0c;段落与段落之间默认为空一行进行分割。 2. 标题标签<h1>-<h6> HTML5使用<hn>和</hn>来标记文本中的标题&#xff0c;其中n需要替换为数字&#x…

关于OPC-UA客户端调用服务端方法CallMethod节点的问题

在OpcUaClient中可以通过CallMethodByNodeId调用方法节点 //// 摘要:// call a server method//// 参数:// tagParent:// 方法的父节点tag//// tag:// 方法的节点tag//// args:// 传递的参数//// 返回结果:// 输出的结果值public object[] CallMetho…

淘宝商品详情数据采集(商品属性,规格,价格,详情图等)

淘宝商品详情数据采集是一个涉及多个步骤的过程&#xff0c;主要目的是获取商品的各种详细信息&#xff0c;如商品属性、规格、价格、详情图等。以下是一个基本的采集流程&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;需要明确要采集的淘宝商品范围&#xff0c;例如…

Filter实现请求日志记录

将锁有得外部访问都记录在日志文件里面&#xff0c;设计这个功能是为了&#xff08;为什么&#xff09;&#xff1a; 1. 在不引入Promentheus进行接口监控时&#xff0c;基于日志文件就可以实现整个项目得监控。 2. 当出现问题时&#xff0c;可以基于此进行流量重放。 效果如…

数据结构知识点汇总(持续更新版)

数据结构 一、绪论 检测知识&#xff1a; 1.1基本概念 以前的计算机 弹道计算机 现如今 主要运用于非数值的计算 基本概念和术语 数据&#xff1a;是信息的载体&#xff0c;描述客观事物属性的值&#xff0c;字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的…

如何发布新闻稿?如何让媒体记者报道自己的企业?

目前&#xff0c;很多企业和个人创业者都知道用新闻稿或软文来做宣传&#xff0c;但是一般只可以发布到自己的微信公众号、百家号等自媒体平台&#xff0c;往往收效甚微。有企业找到小马识途营销顾问咨询原因&#xff0c;小马识途营销顾问分析自媒体上发软文效果不明显的原因主…

NFT交易市场(二)

编写脚本文件进行测试 nft合约代码 // SPDX-License-Identifier: MIT pragma solidity ^0.8.24;import "openzeppelin/contracts/interfaces/IERC20.sol"; import "openzeppelin/contracts/interfaces/IERC721.sol";contract Market {//将erc20初始化为一…