Qt窗口
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Qt的学习】
📝📝本篇内容:基本概念;菜单;工具栏;工具栏基本使用;工具栏动作属性
⬆⬆⬆⬆上一篇:Qt布局管理器
💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-
1.基本概念
在我们之前的学习过程中,我们主要是以QWidget为主的,但是它其实并不是真正的窗口,它更多是作为别的窗口的一部分,我们的QMainWindow才是
其中工具栏主要就是把菜单中一些比较常用的选项直接放到工具栏,直接点击工具栏中的按钮就能快速生效
并且我们的主窗口也只能有一个菜单栏
按照我们的思路来讲,我们的菜单项应该叫做QMenuItem,但是却是QAction,这是因为能够和工具栏相匹配,工具栏本质上就是菜单中的一些选项的快捷方式
2.菜单
接下来就详细讲讲菜单,首先我们要注意在创建项目的时候,不能再使用QWidget,而是使用QMainWindow
创建完项目,我们可以在它的图形化界面中看见它的结构也跟之前不一样了
将关注点放到我们的窗口上,上面一个格子显示让我们输入,这个其实就是菜单栏,我们可以多设置几个菜单,并且还可以设置菜单项
(我的这个版本有bug,菜单项无法输入中文,并且菜单输入中文时需要输入两次才能输入成功,因此我接下来直接使用英文)
这上面是简单的使用图形化界面来实现的,我们要尝试一下代码如何能达到这种效果呢
在这里面我们用到了QMenuBar菜单栏,QMenu菜单,QAction菜单项,我们创建完菜单栏后可以需要将它设置进窗口中,菜单要添加到菜单栏中,菜单项要添加到菜单中。并且要使得我们的菜单项能够有反应,我们就需要进行处理信号,点击菜单项后,它会发出一个triggered信号,我们进行处理就行。
在我们以前各种软件时,都会有快捷键方式来使用菜单和菜单项,这边也可以做到,使用alt+对应字母,来看代码实现
不过这里在选择菜单项的时候,我们只需要单独在键盘上直接输对应字母即可触发(不需要alt了,不知道是不是bug)
除了这个,我们其实还有
子菜单一说,我们可以通过菜单栏QMenuBar的addMenu添加菜单QMenu,我们也可以通过菜单QMenu得addMenu添加子菜单
并且当我们菜单里面菜单项特别多的时候,还可以通过分割线进行分组,使用QMenu的addSeparator函数即可。
在上面的代码中,还有一个要注意的点,就是我们创建菜单栏的代码跟之前不一样了。
这又要提到一个重点,在我们之前创建项目的时候,如果没有勾选自动生成ui文件,此时就不会有什么问题,我们第一次写的代码没有问题,但是如果勾选了自动生成ui文件,上述代码会引起内存泄漏,这是因为我们的Qt已经给我们生成了一个QMenuBar了
这是之前的展示的刚创建好项目的图形化界面的图片,可以看到右上角有menubar。
如果我们按照之前的写法,当设置新的QMenuBar进来的时候,就会导致旧的QMenuBar脱离Qt的对象树,意味着后面就无法对这个对象进行释放。因此需要使用现在的这种写法,调用窗口的menuBar来获取菜单栏,如果QMenuBar已经存在,就直接获取并返回,如果QMenuBar不存在,就先创建一个新的,再返回。接下来就来谈一谈给菜单栏和菜单栏添加图标
这个和之前讲的一样,需要添加图片就需要新建qrc文件,然后使用QIcon进行添加。可以发现如果给QMenu设置图标,当前QMenu是长在QMenuBar上的,此时文本就不显示,图标覆盖了文本,但是我们的菜单项和子菜单是图标和文本都能显示出来。当然可能在搞qrc文件的时候会碰到bug,项目无法识别到,可以直接直接右键项目然后添加新建好的qrc文件
3.工具栏
3.1.工具栏基本使用
我们的工具栏和菜单栏不太一样,一个窗口可以有多个工具栏,也可以没有,工具栏并且也可以手动移动位置,我们使用QToolBar表示工具栏对象,使用addToolBar来添加工具栏。如果细心观察的话,可以知道我们的菜单栏使用的是setMenuBar,一个是set一个是add,其实侧面说明了菜单栏只能有一个,可以重复设置,新的替换旧。工具栏不一样,可以有多个,重复设置,就会出现多个工具栏,不包含"替换",像addMenu和addAction也是一样的道理,可以有多个。
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//菜单栏
QMenuBar* menubar=this->menuBar();
this->setMenuBar(menubar);
//菜单
QMenu* menu1=new QMenu("File");
QMenu* menu2=new QMenu("Edit");
menubar->addMenu(menu1);
menubar->addMenu(menu2);
//菜单项(工具)
QAction* action1=new QAction("Save");
QAction* action2=new QAction("Open");
menu1->addAction(action1);
menu1->addAction(action2);
//信号槽绑定
connect(action1,&QAction::triggered,this,&MainWindow::HandleSave);
connect(action2,&QAction::triggered,this,&MainWindow::HandleOpen);
//工具栏:要手动创建,不会自动创建
QToolBar* toolbar=new QToolBar();
//菜单项放到工具栏中
toolbar->addAction(action1);
toolbar->addAction(action2);
this->addToolBar(toolbar);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::HandleSave()
{
qDebug()<<"Handle Save....";
}
void MainWindow::HandleOpen()
{
qDebug()<<"Handle Open....";
}

我们的工具栏不会像菜单栏一样会自动创建,因此我们需要自己创建。可以看到我们的工具栏左边有几个小点,按住它并拖动可以移动位置。并且我们往工具栏里添加内容时是添加的是菜单项,这个前面也说过了,工具栏就是菜单项的快捷键。因此我们的既可以使用菜单项触发功能,也能使用工具栏中的快捷键触发
那这样就会有一个问题:如果一个QAction既是QMenu的子元素,又是QToolBar的子元素,释放的时候是否会重复delete?结果肯定是不会的,这就像C/C++中,动态开辟的内存多次释放,并不会出现问题。
我们也可以给它增加图标,这其实就是给菜单项添加图标
工具栏上的QAction,也会出现图标覆盖文本的情况,也是因为空间有限导致的。那我们之前设置的文本就没用了吗,当然不是,它会以toolTip的方式来存在,鼠标悬停上去的时候,就会显示出一段提示信息,并且我们也可以手动设置toolTip
3.2.工具栏动作属性
首先,我们的Qt可以设置工具栏出现的初始位置(上下左右),这个我们可以在添加工具栏(addToolBar)的时候设置,下面图片展示可以设置的常量
=
我们也可以设置工具栏允许停靠的位置,同样是使用上面的常量以及使用工具栏的setAllowedAreas()函数进行设置
可以看到我们的工具栏不能在上和下进行停靠,只能浮动,这就要引出它的第三个特性,浮动。
我们也有函数setFloatable可以设置它是否允许浮动
说完了浮动,那就是移动的问题,可以使用setMoveable函数来控制
🌸🌸Qt的窗口大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪






















