【Qt】QMainWindow

目录

一、概念

二、菜单栏

2.1 创建菜单栏

2.2 在菜单栏中添加菜单

2.3 创建菜单项

2.4 在菜单项之间添加分割线

三、工具栏

3.1 创建工具栏

3.2 设置停靠位置

3.3 设置浮动属性

3.4 设置移动属性

四、状态栏

4.1 状态栏的创建

4.2 显示实时消息

4.3 显示永久消息

五、浮动窗口

5.1 浮动窗口的创建

5.2 设置停靠位置


一、概念

QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等

下图为QMainwindow中各组件所处的位置:


 

二、菜单栏

Qt中的菜单栏是通过QMenuBar类实现的。一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面

菜单栏中包含菜单,菜单中包含菜单项

2.1 创建菜单栏

方法一

菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现

QMenuBar * menuBar() const
  • 该函数会返回主窗口的菜单栏。若菜单栏不存在,此函数将创建并返回一个空的菜单栏。若菜单栏存在则不会创建,返回已有的菜单栏
  • 若创建项目时勾选了创建ui文件,则推荐使用本方法,不推荐在堆上创建菜单栏
  • 因为在勾选ui文件后会项目会自动创建菜单栏,又在堆上创建的话,会导致自动创建的菜单栏无法释放,造成内存泄漏
//创建菜单栏
QMenuBar* menubar = menuBar();
//将菜单栏设置进窗口中
this->setMenuBar(menubar);

方法二:在堆上动态创建

使用setMenuBar把菜单栏放到窗口中 

//创建菜单栏
QMenuBar* menubar = new QMenuBar(this);
//将菜单栏设置进窗口中
this->setMenuBar(menubar);

2.2 在菜单栏中添加菜单

创建菜单,并通过QMenu提供的addMenu()函数来添加菜单

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar = menuBar();
    this->setMenuBar(menubar);
    //创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("构建");
    //将菜单添加到菜单栏中
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
}

MainWindow::~MainWindow()
{
    delete ui;
}


 

2.3 创建菜单项

在Qt中,并没有专门的菜单项类,可以通过QAction类,抽象出公共的动作

QAction可以给菜单栏使用,也可以给工具栏使用

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar = menuBar();
    this->setMenuBar(menubar);
    //创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("构建");
    //将菜单添加到菜单栏中
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
    //创建菜单项
    QAction* action1 = new QAction("open");
    QAction* action2 = new QAction("close");
    QAction* action3 = new QAction("create");
    //将菜单项添加到菜单上
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
}

MainWindow::~MainWindow()
{
    delete ui;
}

2.4 在菜单项之间添加分割线

添加分割线是通过QMenu类提供的addSeparator()函数来实现

menu1->addAction(action1);
menu1->addSeparator();
menu1->addAction(action2);
menu1->addSeparator();
menu1->addAction(action3);

三、工具栏

工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。可以有多个,也可以没有,并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在

如下图为工具栏的示意图:

3.1 创建工具栏

调用QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需调用一次该函数

如添加两个工具栏:

QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(toolbar1);
this->addToolBar(toolbar2);


 

3.2 设置停靠位置

工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过QToolBar类提供的setAllowedAreas()函数来设置

方法一:创建工具栏的同时指定其停靠的位置

  • Qt::LeftToolBarArea        停靠在左侧
  • Qt::RightToolBarArea        停靠在右侧
  • Qt::TopToolBarArea        停靠在顶部
  • Qt::BottomToolBarArea        停靠在底部
  • Qt::AllToolBarAreas        以上四个位置都可停靠
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
//创建工具栏时,指定工具栏在左侧显示
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
//创建工具栏时,指定工具栏在右侧显示
this->addToolBar(Qt::RightToolBarArea, toolbar2);

方式二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(toolbar1);
this->addToolBar(toolbar2);
//只允许在左侧停靠
toolbar1->setAllowedAreas(Qt::LeftToolBarArea);
//只允许在右侧停靠
toolbar2->setAllowedAreas(Qt::RightToolBarArea);

注意:

在创建工具栏时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置

3.3 设置浮动属性

工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置

void setFloatable (bool floatable)
QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
this->addToolBar(Qt::RightToolBarArea, toolbar2);
toolbar1->setFloatable(true);//允许工具栏浮动
toolbar2->setFloatable(false);//不允许工具栏浮动

3.4 设置移动属性

设置工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置

void setMovable(bool movable)

注意:若设置工具栏为不移动状态,则设置其停靠位置的操作就不会生效,所以设置工具栏的移动属性类似于总开关的效果
 

QToolBar* toolbar1 = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(Qt::LeftToolBarArea, toolbar1);
this->addToolBar(Qt::RightToolBarArea, toolbar2);
toolbar1->setMovable(true);//允许移动
toolbar2->setMovable(false);//不允许移动

四、状态栏

状态栏是应用程序中输出简要信息的区域。一般位于主窗口的最底部,一个窗口中最多只能有一个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的

在状态栏中可以显示的消息类型有:

  • 实时消息:如当前程序状态
  • 永久消息:如程序版本号,机构名称
  • 进度消息:如进度条提示,百分比提示

4.1 状态栏的创建

状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建

QStatusBar* stbar = statusBar();
this->setStatusBar(stbar);

4.2 显示实时消息

在状态栏中显示实时消息是通过showMessage()函数来实现

//状态栏中显示约2秒的"Hello_Qt"
stbar->showMessage("Hello_Qt", 2000);

4.3 显示永久消息

在状态栏中可以显示永久消息,此处的永久消息是通过标签来显示的
 

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QStatusBar* stbar = statusBar();
    this->setStatusBar(stbar);
    //创建标签
    QLabel* label = new QLabel("提示消息", this);
    //将标签放入状态栏
    stbar->addWidget(label);
}

MainWindow::~MainWindow()
{
    delete ui;
}

调整显示消息的位置

//创建标签
QLabel* label2 = new QLabel("右侧提示消息", this);
//将标签放入状态栏
stbar->addPermanentWidget(label2);

五、浮动窗口

在Qt中,浮动窗口也被称为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能,浮动窗口一般是位于核心部件的周围,可以有多个

5.1 浮动窗口的创建

浮动窗口的创建是通过QDockWidget类提供的构造方法QDockWidget()函数动态创建的

//浮动窗口
QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);
//将浮动窗口设置与当前窗口中
this->addDockWidget(Qt::BottomDockWidgetArea, dockwidget);

5.2 设置停靠位置

浮动窗口是位于中心部件的周围。可以通过QDockWidget类中提供setAllowedAreas()函数设置其允许停靠的位置

其中可以设置允许停靠的位置有:

  • Qt::LeftDockWidgetArea        停靠在左侧
  • Qt::RightDockWidgetArea        停靠在右侧
  • Qt::TopDockWidgetArea        停靠在顶部
  • Qt::BottomDockWidgetArea        停靠在底部
  • Qt::AllDockWidgetAreas        以上四个位置都可停靠
//只允许上下停靠
dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

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

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

相关文章

vue3+vite模版框架 tabs右键刷新时丢失路由参数

问题: 标题栏的tabs的右键:刷新时,没有保存上一个页面传递过来的参数 分析: TagView.vue刷新事件 function refreshSelectedTag(view: TagView) {console.log(|--执行刷新, view)tagsViewStore.delCachedView(view);const {full…

Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…

004 高并发内存池_ThreadCache设计

​🌈个人主页:Fan_558 🔥 系列专栏:高并发内存池 🌹关注我💪🏻带你学更多知识 文章目录 前言文章重点一、设计FreeList自由链表结构二、定制对齐映射规则三、完成申请Allocate与释放Deallocate…

数据结构:链表的双指针技巧

文章目录 一、链表相交问题二、单链表判环问题三、回文链表四、重排链表结点 初学双指针的同学,请先弄懂删除链表的倒数第 N 个结点。 并且在学习这一节时,不要将思维固化,认为只能这样做,这里的做法只是技巧。 一、链表相交问题 …

【免费获取】【下片神器】IDM非主流网站视频免费下载神器IDM+m3u8并解决idm下载失败问题 idm下载器超长免费试用

当你浏览一个网站,看到一个喜欢的视频,不知道如何下载的时候,本教程或许可以帮你点小忙。大部分的主流网站都有专门的下载工具,本篇教程主要针对的是一些非主流的小网站。 我们的下载方法就是利用IDM(Internet Downlo…

npm卸载不掉的解决方案

不管怎么重装重启都报错 真服了,npm卸载不掉绝对是有缓存存在,用where npm查到d盘 实际上根本不在这个地方,这个是我安装的6.14.12版本的npm的地方,我说我怎么怎么重装怎么导包都不行呢,偷偷隐藏在这个目录里面&#…

Unity 学习日记 13.地形系统

下载源码 UnityPackage 1.地形对象Terrain 目录 1.地形对象Terrain 2.设置地形纹理 3.拔高地形地貌 4. 绘制树和草 5.为地形加入水 6.加入角色并跑步 7.加入水声 右键创建3D地形: 依次对应下面的按钮 || 2.设置地形纹理 下载资源包 下载资源包后&#x…

【Ubuntu】文件和目录的增、删、改、查操作

这里写目录标题 (一)文件和目录类命令的使用1、目录与文件的增加(1)目录的增加 :(2)文件的增加 2、目录与文件的删除(1)目录和文件的删除 3、目录与文件的修改(1)mv命令 4、目录与文…

【跟着CHATGPT学习硬件外设 | 01】SPI

文章目录 🚀 概念揭秘关键精华🌟 秒懂案例生活类比实战演练 🔍 原理与工作流程探秘步骤1:初始化SPI接口步骤2:主设备启动通信步骤3:主设备发送数据步骤4:从设备接收数据步骤5:从设备…

Zookeeper(九)客户端的启动流程

目录 一 ZooKeeper会话的创建与连接1.1 会话的创建1.1.1 ClientWatchManager1.1.2 ConnectStringParser1.1.3 HostProvider1.1.4 ClientCnxn 1.2 会话的连接1.2.1 SendThread1.2.2 eventThread 二 ZooKeeper会话的响应2.1 接受服务端响应 三 ClientCnxn 详解3.1 Packet3.2 队列…

一文彻底搞懂并发容器

文章目录 1. 什么是并发容器2. 并发容器的分类 1. 什么是并发容器 并发容器是一种用于多线程环境的数据结构,它们能够有效地处理并发访问和修改的问题。在多线程应用程序中,多个线程可能会同时访问和修改共享的数据结构,这可能会导致数据不一…

一文教你如何轻松领取阿里云优惠券

随着云计算技术的飞速发展,越来越多的企业和个人选择使用阿里云作为他们的云服务提供商。为了吸引更多的用户上云,阿里云推出了各种优惠券和促销活动。本文将教大家如何轻松领取阿里云优惠券,以便在购买阿里云产品和服务时享受更多优惠。 一、…

激发数据潜力:企业数据中台的策略性构建与优化_光点科技

在信息时代,数据是企业价值链中不可或缺的一环。构建一个策略性的企业数据中台不仅能够整合分散的数据资源,还能提高决策效率和业务敏捷性。本文聚焦于如何策略性地构建和优化数据中台,以便企业能够最大化地利用数据资源,推动企业…

Sora是否能颠覆视频制作行业?一文带你了解

一个月前OpenAI宣布了一款名为Sora的新生成式人工智能系统,该系统可以根据文本提示生成短视频。虽然Sora尚未向公众开放,但迄今为止发布的高质量样本已经引起了兴奋和担忧的反应。 OpenAI发布的样本视频(该公司称这些视频是由Sora直接制作&am…

反应式编程(三)什么是粘包、拆包?如何解决?

目录 一、粘包、拆包介绍1.1 什么是 TCP 协议?1.2 什么是粘包、拆包?1.3 粘包、拆包的四种情况1.4 粘包、拆包的原因1)TCP协议中的滑动窗口机制2)传输层的 MSS 与链路层的 MTU3)TCP协议中的 Nagle 算法4)应…

【智能算法】晶体结构算法(CryStAl)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,S Talatahari等人受到晶体自然结构启发,提出了晶体构造算法(Crystal Structure Algorithm , CryStAl)。 2.算法原理 2.1算法思想 CryStAl受…

Python学习笔记-简单案例实现多进程与多线程

Python 的多进程与多线程是并发编程的两种重要方式,用于提高程序的执行效率。它们各自有不同的特点和适用场景。 多进程(Multiprocessing) 概念: 多进程是指操作系统中同时运行多个程序实例,每个实例称为一个进程。…

Jmeter 分布式压测,你的系统能否承受高负载?

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子,它模拟了同时有 5000 个用户,循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 ​结果分析 ​但是,实际企业中,这种压测方式根本不满足实际需求。下…

java入门学习Day03

本篇文章主要有java中的变量、命名方法、数据类型。 一、java中的变量 数据类型 变量名 数据值;int money 50; public class varibledemo {public static void main(String[] args) {int money 50;//变量的输出System.out.println(money);money 6…

ctfshow-web入门-xxe

什么是xxe? XXE,全称XML External Entity Injection,即XML外部实体注入。这是一种针对应用程序解析XML输入类型的攻击。当包含对外部实体的引用的XML输入被弱配置的XML解析器处理时,就会发生这种攻击。这种攻击通过构造恶意内容&…