【QT:窗口】

devtools/2025/3/21 4:48:13/

目录

窗口概述: 

菜单栏的使用:

 给菜单设置快捷键:

添加子菜单:

添加分割线:​编辑 

给菜单添加图标:

QMenuBar的创建:

 工具栏:

给工具栏添加图标

 添加多个工具栏:

状态栏:

浮动窗口:

 对话框:

自定义对话框:

模态对话框:

消息对话框:

颜色对话框:

 文件对话框:

​编辑​编辑字体对话框:

​编辑​编辑 总结:


窗口概述: 

在上一篇中的代码都是基于QWidget控件的,而QWidget更多的是作为别的窗口的一部分,QMainWindow是窗口的一个整体部分,以下是它的组成成分

菜单栏的使用:

一个主窗口最多只能有一个菜单栏

与QWidget不同的是,点入图形化界面会在界面上有一个“在这里输入”,此处是往菜单栏中添加菜单

当往此处添加菜单后,就建立好了一个菜单,此时还会弹出两个在这里输入的选项 

在图形化界面设计菜单的效果如图:

除了图形化设计菜单,也可以通过代码实现:

  //创建一个菜单栏QMenuBar* menuBar=new QMenuBar();//将菜单栏设置进当前窗口this->setMenuBar(menuBar);//创建菜单QMenu* menu1=new QMenu("文件");QMenu* menu2=new QMenu("编辑");QMenu* menu3=new QMenu("视图");QMenu* menu4=new QMenu("工具");//将菜单添加到菜单栏中menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);menuBar->addMenu(menu4);//给菜单添加菜单项QAction* action1=new QAction("保存");QAction* action2=new QAction("另存为");QAction* action3=new QAction("退出");//将菜单项添加到菜单中menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);//给action添加信号connect(action1,&QAction::triggered,this,&MainWindow::handle);connect(action3,&QAction::triggered,this,&MainWindow::close);

 给菜单设置快捷键:

通过给文本设置添加&F这样的操作,就是添加了快捷键alt+F,这与QWidget中的设置伙伴一样的操作

代码:

 //创建一个菜单栏QMenuBar* menuBar=new QMenuBar();//将菜单栏设置进当前窗口this->setMenuBar(menuBar);//创建菜单QMenu* menu1=new QMenu("文件 (&A)");QMenu* menu2=new QMenu("编辑 (&S)");QMenu* menu3=new QMenu("视图 (&D)");QMenu* menu4=new QMenu("工具 (&F)");//将菜单添加到菜单栏中menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);menuBar->addMenu(menu4);//给菜单添加菜单项QAction* action1=new QAction("保存 (&Z)");QAction* action2=new QAction("另存为 (&X)");QAction* action3=new QAction("退出 (&C)");QAction* action4=new QAction("剪切 (&Q)");QAction* action5=new QAction("复制 (&E)");QAction* action6=new QAction("粘贴 (&R)");QAction* action7=new QAction("书签 (&H)");QAction* action8=new QAction("粘贴代码 (&J)");QAction* action9=new QAction("外部 (&K)");//将菜单项添加到菜单中menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);menu2->addAction(action4);menu2->addAction(action5);menu2->addAction(action6);menu3->addAction(action7);menu3->addAction(action8);menu3->addAction(action9);

添加子菜单:

QMenu提供了addMenu,通过 该操作添加子菜单

 //创建菜单栏QMenuBar* menuBar=new QMenuBar();//将菜单栏设置进窗口this->setMenuBar(menuBar);//创建父子菜单QMenu* parentMenu=new QMenu("文件");QMenu* childMenu=new QMenu("新建");//将父菜单设入菜单栏中,子菜单设入父菜单中menuBar->addMenu(parentMenu);parentMenu->addMenu(childMenu);//往父菜单中添加普通菜单QAction* action1=new QAction("保存");QAction* action2=new QAction("打开");parentMenu->addAction(action1);parentMenu->addAction(action2);//往子菜单中添加普通菜单QAction* action3=new QAction("创建word");QAction* action4=new QAction("创建PDF");childMenu->addAction(action3);childMenu->addAction(action4);

添加分割线:
 

 //往父菜单中添加普通菜单QAction* action1=new QAction("保存");QAction* action2=new QAction("打开");parentMenu->addAction(action1);parentMenu->addSeparator();//添加分割线parentMenu->addAction(action2);

给菜单添加图标:

 这里添加图标和之前在控件中添加图标是一样的,还是使用Icon类,并且使用qrc,将图片资源传入qrc中

QMenuBar的创建:

  1. 如果创建的项目没有勾选自动ui文件,此时该代码是安全的,但如果勾选自动ui文件,该代码就有内存泄漏的风险
  2. 勾选了自动Ui文件就面临着QT已经生成了一个QMenuBar,当创建了一个新的menubar后那么之前的menubar脱离了Qt的对象树,这就意味着无法对该对象进行释放
  3. 上述程序如果窗口关闭,对象释放了进程也就随之结束,所有内存被系统回收,内存泄漏就不会造成影响
  4. 但是如果出现在一个多窗口的程序中,窗口频繁的创建销毁,该内存泄漏就会严重 

解决以上的内存泄漏问题,可以将代码修改为如下:

 

  • 如果Qmenubar已经存在,就会获取并返回
  • 如果qmennubar不存在,就会创建新的并返回

此时就不存在新的qmenubar将旧的qmenubar从对象树中挤下来而造成的内存泄漏问题 


 工具栏:

一个窗口可以有多个工具栏,工具栏需要手动创建,自身不会自动创建

给工具栏添加图标

 

 

图标覆盖率文本,但文本不会消失,该文本会以tooltip显示,当鼠标悬停在图标上时就会出现,也可以手动设置tooltip

问题:一个QAction即属于菜单又属于工具栏,当释放时是否会重复释放?

不会重复释放,只会释放一次 

 添加多个工具栏:

 

这些点能够鼠标拖动工具栏,此时的工具栏是浮动状态,可以设置工具栏出现的初始位置,也可以设置工具栏允许停放的边缘,是否允许浮动、移动。相关函数为:addToolBar(指定工具栏的位置)setAllowedAreas(允许停靠的位置)

addToolBar相关参数
QT::LeftToolBarArea停靠在左侧
QT::RightToolBarArea停靠在右侧
QT::TopToolBarArea停靠在顶部
QT::BottonToolBarArea停靠在底部
QT::AllToolBarAreas四个位置都可停靠

状态栏:

上面图片即为状态栏,显示当前状态。

状态栏关于元素添加的顺序:

showMessage中的第二个参数为状态栏显示的时间 ,此外状态栏也可以添加控件,如下:


浮动窗口:

当给子窗口添加控件时,不能直接添加,

  1. 需要先添加一个widget控件,将widget添加到子窗口中
  2. 往widget中添加控件

 对话框:

Qt中使用QDialog类表示对话框 ,对话框是GUI中不可缺少的一部分。一些不适合在主窗口中实现的功能组件客户以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务和简洁的用户交互。

Qt常用的内置对话框
QFiledialog文本对话框
QColorDialog颜色对话框
QFontDialog字体对话框
QInputDialog输入对话框
QMessageBox消息框

例子:在主窗口中通过点击按钮弹出一个新的对话框

 

 

dialog每次点击都会创建一个新的QDialog并显示,在程序运行过程中不断点击创建就会造成内存泄漏的问题,因此需要及时的对对话框进行销毁,防止内存泄漏的问题

解决方案:让用户点击关闭对话框的同时销毁对话框,将delete和点击信号关联起来,Qt中解决方法是在QDailog设置属性

自定义对话框:

自定义对话框需要继承QDailog创建类 

通过图形化界面创建:

  1. 新建项目,选中QT,再选择QT设计师界面类
  2. 此时拥有两个ui界面
  3. 拖拽控件,设定槽函数将这俩界面关联起来

模态对话框:

  1.  模态:弹出对话框时,用户无法操作父窗口,必须完成对话框中的操作,关闭对话框后。
  2. 非模态:弹出对话框后用户可以操作父窗口

 

消息对话框:

显示消息给用户并让用户进行简单的选择

也可以通过QMesssage中的静态函数warning来一步到位实现:

如果想在里面构建自定义对象则不能通过使用静态函数一步到位实现。

颜色对话框:

修改背景色:

 文件对话框:

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件,通过QFileDialog能够获取到这个文件路径

  • QString getOpenFileName //打开文件
  • QString getOpenFileNames//打开多个文件
  • QString SaveFileName //保存文件

字体对话框:

用于提供选择字体的对话框部件

当用户在此处设置了属性并点击Ok后函数就会返回一个QFont对象

把用户所选的属性应用的窗口文字的按钮属性上,代码实例:

输入对话框:

用于临时数据输入的场合

常用静态函数方法介绍
double getDouble双精度浮点型输入数据对话框
int getInt整型输入数据对话框
QString getItem选择条目型输入数据框

 总结:

  1. 菜单栏:菜单栏中包含菜单,菜单中有菜单项,菜单在窗口中是唯一的
  2. 工具栏:在窗口中工具栏可以有多个
  3. 子窗口:放置其他的控件
  4. 状态栏:在程序下面显示状态
  5. 对话框:通过对话框可以对窗口进行文字,颜色,背景的设置

http://www.ppmy.cn/devtools/168802.html

相关文章

HTML5 drag API实现列表拖拽排序

拖拽API(Drag and Drop API)是HTML5提供的一组功能,使得在网页上实现拖放操作变得更加简单和强大。这个API允许开发者为网页元素添加拖拽功能,用户可以通过鼠标将元素拖动并放置到指定的目标区域。 事件类型 dragstart&#xff1…

为什么渲染农场渲染帧而非视频?核心原因 + 举例

核心原因 举例 1. 并行加速 原理:每帧独立计算,多台电脑同时工作。 举例:100 帧动画→100 台电脑各渲 1 帧,1 小时完成(单台需 100 小时) 2. 改错成本低 原理:单帧出错仅需重渲该帧&#xf…

STM32之I2C硬件外设

注意:硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器,此时会置状态寄存器的TXE为1,表示发送寄存器为空,然后往数据控制寄存器中一位一位的移送数…

大模型学习-从零开始在colab训练大模型

目录 写这篇文章的目的 1.准备训练所需的文件 2.将压缩包上传到谷歌云盘 使用colab 3.训练 写这篇文章的目的 这篇文章是对:大模型学习-在colab中训练并更换模型_colab调整模型-CSDN博客的一个优化,因为在之前的博文中,我是提供了一个现…

Java高频面试之集合-15

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:解决哈希冲突有哪些方法? 1. 开放寻址法(Open Addressing) 核心思想:当哈…

【Go】函数闭包、堆和栈的概念

闭包 闭包机制解析 在函数式编程中,闭包(Closure) 是一种特殊的函数结构,其核心特性是能够捕获并持有外部函数的上下文环境变量。这一机制打破了传统函数中局部变量的生命周期规则: 常规局部变量 在函数被调用时创建…

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合,实际上我们只需要看一部分就行了,也就是从集合的所有元素里挑出恰好满足集合总和的一半儿,当然,如果我们的集合总和是奇数的话,我们是无论如何也挑不出刚好一半儿的,因为我们没有小数&a…

【C++———IO流】

听专情的古人,把美言留给最爱的人........................................................................................ 文章目录 前言 一、【C/C IO流】 1、【C语言的输入与输出】 2、【CIO流引入】 二、【C标准IO流——】 2.1、【cin&&cout】 2.2…