【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);

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

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

相关文章

Vue性能优化--gZip

一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chro…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

python习题小练习(挑战全对)

1. (单选题)Python 3.0版本正式发布的时间? A. 1991B. 2000C. 2008D. 1989 2. (单选题)以下关于Python语言中“缩进”说法正确的是: A. 缩进在程序中长度统一且强制使用B. 缩进是非强制的,仅为了提高代码可读性C. 缩进可以用在任何语句之后…

超文本传输协议HTTP

HTTP协议 在网络通信中,我们可以自己进行定制协议,但是也有许多已经十分成熟的应用层协议,比如我们下面说的HTTP协议。 HTTP协议简介 HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一…

带你学习现代C++并发编程

通过对C并发编程的理解,我总结了相关的文档,有需要的可以关注我公众号,并给我留言! 这是目录

专升本-现代通信技术5G

现代通信技术 什么是通信: 人与人,人与自然之间通过某种行为或者媒体介质进行信息交流和传递 通信的基本要素: 信源 ----信道(噪音-干扰)-----信宿 通信技术是什么? 研究从信息的源头到信息的目的地整…

Cookie/Session

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

创建数据库管理账户以及授权

一、创建数据酷管理账户命令 为了保障数据库系统的安全性,以及让 其他用户协同管理数据库,可以在MariaDB数据库管理系统中为他们创建多个专用的数据库管理账户,然后再分配合理的权限,以满足他们的工作需求. 使用root管理员 登录…

机器学习模型——SVM(支持向量机)

基本概念: Support Vector Machine (支持向量机): 支持向量:支持或支撑平面上把两类类别划分开来的超平面的向量点。 机:一个算法 SVM是基于统计学习理论的一种机器学习方法。简单地说,就是将数据单元…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…

Mybatis在SpringBoot中是如何被加载执行

首先依赖于springboot的自动装配EnableAutoConfiguration注解,这个注解最终帮助我们读取mybatis-spring-boot-autoconfigure-x.x.x.jar中的META-INF\spring.factories配置类: org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.myb…

Mysql数据库——阻塞语句查询与分析

目录 前言 阻塞语句查询与分析 Show Processlist——查看每个与数据库连接的session状态 非Sleeping状态进程数 执行时间较长进程号 查看当前运行的所有事务 当前锁 被blocking阻塞的事务数 数据库连接数 查看锁状态 正在被使用的表 前言 MySQL阻塞是指并发访问时&…

LInux|命令行参数|环境变量

LInux|命令行参数|环境变量 命令行参数main的参数之argc&#xff0c;argv几个小知识<font color#0099ff size 5 face"黑体">1.子进程默认能看到并访问父进程的数据<font color#4b0082 size 5 face"黑体">2.命令行创建的程序父进程都是bash 环…

微分方程错题本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

【图像超分】论文精读:Image Super-Resolution Using Dense Skip Connections(SRDenseNet)

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related work2.1. S…

解释TCP和UDP之间的区别

解释TCP和UDP之间的区别 TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种在网络中广泛使用的传输层协议&#xff0c;它们各自具有独特的特点和适用场景。下面将详细解释TCP和UDP之间的区别&#xff0c;并从多个维度进行对比。 连…

设计模式(4):建造者模式

一.场景 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理&#xff1a; 装配这些子组件是不是有个步骤问题&#xff1f; 实际开发中&#xff0c;我们所需要的对象构建时&#xff0c;也非常复杂&#xff0c;有很多步骤需要处理时…

【Qt】:信号与槽(二)

信号与槽 一.带参数的信号和槽二.信号与槽的多对多连接三.信号与槽的断开四.lamda表达式定义槽函数 一.带参数的信号和槽 Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载.此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.&#xff08;一致指的是类型一致&a…

【算法笔记】 树形DP算法总结

定义&#xff1a;树形DP也叫树状DP&#xff0c;即在树上进行的DP&#xff0c;是DP中较为复杂一类 1&#xff1a;主体 即like拓扑排序&#xff0c;从叶子节点向上更新其父节点&#xff0c;从而进行dp&#xff0c;确保先更新的子节点去更新其父节点&#xff0c;一般使用dfs形式…

mysql安装遇到的问题

最近mysql安装遇到了许多问题 这个界面是下载器界面&#xff0c;reconfigure是重新配置这个版本&#xff0c;要新安装要点add 进入这个界面选择对应的版本下载