【QT:窗口】
目录
窗口概述:
菜单栏的使用:
给菜单设置快捷键:
添加子菜单:
添加分割线:编辑
给菜单添加图标:
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的创建:
- 如果创建的项目没有勾选自动ui文件,此时该代码是安全的,但如果勾选自动ui文件,该代码就有内存泄漏的风险
- 勾选了自动Ui文件就面临着QT已经生成了一个QMenuBar,当创建了一个新的menubar后那么之前的menubar脱离了Qt的对象树,这就意味着无法对该对象进行释放
- 上述程序如果窗口关闭,对象释放了进程也就随之结束,所有内存被系统回收,内存泄漏就不会造成影响
- 但是如果出现在一个多窗口的程序中,窗口频繁的创建销毁,该内存泄漏就会严重
解决以上的内存泄漏问题,可以将代码修改为如下:
- 如果Qmenubar已经存在,就会获取并返回
- 如果qmennubar不存在,就会创建新的并返回
此时就不存在新的qmenubar将旧的qmenubar从对象树中挤下来而造成的内存泄漏问题
工具栏:
一个窗口可以有多个工具栏,工具栏需要手动创建,自身不会自动创建
给工具栏添加图标
图标覆盖率文本,但文本不会消失,该文本会以tooltip显示,当鼠标悬停在图标上时就会出现,也可以手动设置tooltip
问题:一个QAction即属于菜单又属于工具栏,当释放时是否会重复释放?
不会重复释放,只会释放一次
添加多个工具栏:
![]()
这些点能够鼠标拖动工具栏,此时的工具栏是浮动状态,可以设置工具栏出现的初始位置,也可以设置工具栏允许停放的边缘,是否允许浮动、移动。相关函数为:addToolBar(指定工具栏的位置)setAllowedAreas(允许停靠的位置)
QT::LeftToolBarArea | 停靠在左侧 |
QT::RightToolBarArea | 停靠在右侧 |
QT::TopToolBarArea | 停靠在顶部 |
QT::BottonToolBarArea | 停靠在底部 |
QT::AllToolBarAreas | 四个位置都可停靠 |
状态栏:
上面图片即为状态栏,显示当前状态。
状态栏关于元素添加的顺序:
showMessage中的第二个参数为状态栏显示的时间 ,此外状态栏也可以添加控件,如下:
浮动窗口:
当给子窗口添加控件时,不能直接添加,
- 需要先添加一个widget控件,将widget添加到子窗口中
- 往widget中添加控件
对话框:
Qt中使用QDialog类表示对话框 ,对话框是GUI中不可缺少的一部分。一些不适合在主窗口中实现的功能组件客户以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务和简洁的用户交互。
QFiledialog | 文本对话框 |
QColorDialog | 颜色对话框 |
QFontDialog | 字体对话框 |
QInputDialog | 输入对话框 |
QMessageBox | 消息框 |
例子:在主窗口中通过点击按钮弹出一个新的对话框
dialog每次点击都会创建一个新的QDialog并显示,在程序运行过程中不断点击创建就会造成内存泄漏的问题,因此需要及时的对对话框进行销毁,防止内存泄漏的问题
解决方案:让用户点击关闭对话框的同时销毁对话框,将delete和点击信号关联起来,Qt中解决方法是在QDailog设置属性
自定义对话框:
自定义对话框需要继承QDailog创建类
通过图形化界面创建:
- 新建项目,选中QT,再选择QT设计师界面类
- 此时拥有两个ui界面
- 拖拽控件,设定槽函数将这俩界面关联起来
模态对话框:
- 模态:弹出对话框时,用户无法操作父窗口,必须完成对话框中的操作,关闭对话框后。
- 非模态:弹出对话框后用户可以操作父窗口
![]()
消息对话框:
显示消息给用户并让用户进行简单的选择
也可以通过QMesssage中的静态函数warning来一步到位实现:
如果想在里面构建自定义对象则不能通过使用静态函数一步到位实现。
颜色对话框:
修改背景色:
文件对话框:
文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件,通过QFileDialog能够获取到这个文件路径
- QString getOpenFileName //打开文件
- QString getOpenFileNames//打开多个文件
- QString SaveFileName //保存文件

字体对话框:
用于提供选择字体的对话框部件
当用户在此处设置了属性并点击Ok后函数就会返回一个QFont对象
把用户所选的属性应用的窗口文字的按钮属性上,代码实例:
输入对话框:
用于临时数据输入的场合
double getDouble | 双精度浮点型输入数据对话框 |
int getInt | 整型输入数据对话框 |
QString getItem | 选择条目型输入数据框 |

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