Qt 系列(三)——窗体

前言

这篇来认识下Qt中的三个窗口类,MainWindow、Widget、Dialog

MainWindow

这个作为一个程序的主窗口,拥有menu菜单栏、tool工具栏、status状态栏、任务栏右侧托盘等,相当于是一个大的窗体架子。

一个mainwindow中可以放置多个widget,下一篇聊下多界面的切换。

这里可以新建的qt工程选MainWindow,或者在原来的demo工程上,可以再重新添加回初始的菜单栏、工具栏、状态栏来做下测试。

QMenu

MainWindow设置

新建完这些栏,双击菜单栏开始新建菜单,编辑菜单,菜单名称选中对应菜单,在属性栏中找QMenu,在这一区域设置text属性可以修改成中文。

菜单

当然也可以通过程序里来动态添加菜单,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
void QtDemo::addMenu()
{
// 添加菜单
QMenu* menu = this->menuBar()->addMenu("backend_add");
// 添加菜单下按钮
QAction* action1 = menu->addAction("add_1");
QMenu* childMenu = menu->addMenu(QString::fromLocal8Bit("中文"));
QAction* action2 = childMenu->addAction(QString::fromLocal8Bit("菜单2"));
QAction* action3 = childMenu->addAction(tr("菜单3"));
QAction* action4 = childMenu->addAction(QStringLiteral("菜单4"));
}

这里穿插下中文,当然这主要是在windows上会出现中文乱码比较频繁,因为系统默认是GB2312,vs也是默认GB2312(肯定是可以修改utf-8,只是懒得改),这里有几个方式显示中文,也就是上面代码展示的,回头找时间鼓捣完中文这块单独再写,常用的方式就是除了tr,这玩意儿确实是为了多语言,需要先整理好多语言的对应文件。

来看下运行后菜单的效果。

ui设置

程序设置

乱码的情况上面也说了,tr是为了国际化使用的,在没有设置编码格式的时候,编辑器也不知道要用哪种。

QToolBar

这个因为没咋用过,也试了下发下从designer这没法往里丢控件,看来是只能通过代码去添加Action了,不过总的来看这玩意儿是个DockPanel(跟vs里这窗口栏那窗口栏一样,拖哪自己定)。

1
2
3
4
5
6
7
8
9
10
void QtDemo::addTool()
{
QAction* action = ui->toolBar->addAction("action1");
// 添加个右侧工具栏
QToolBar* toolbar = new QToolBar();
this->addToolBar(Qt::ToolBarArea::RightToolBarArea, toolbar);
toolbar->setMovable(false);
QAction* action1 = toolbar->addAction(QStringLiteral("工具栏"));
}

QStatusBar

状态栏这个,像大多数应用程序需要有个提示进度啊或者提示信息之类的,就可以直接在这个区域丢控件了。

1
2
3
4
5
6
void QtDemo::addStatus()
{
// ui->statusBar->addWidget(new QLabel(QStringLiteral("这是状态栏")));
ui->statusBar->addPermanentWidget(new QLabel(QStringLiteral("这是状态栏111")));
ui->statusBar->showMessage("test1111", 5000);
}

最终所有的设置完成后,效果如下。

效果

QWidget

窗体小部件,它是所有窗口界面的基类,接收用户交互,界面展示,所有子控件可以放在widget下,如果细看的话,本身选MainWindow默认会有个Widget名字叫centralWidget

我们来新建个测试用的Widget,然后给这个新建的ui里只放个Label,内容自己随便写,之后回到MainWindow的头文件,声明这个Widget,在cpp里new一个,隐藏掉原有的centralWidget(当然不隐藏也可以,两个Widget会同时显示,不好看)。

1
2
3
4
5
// .h
#include "TestWidget.h"
...
TestWidget* widget;
...
1
2
3
// .cpp
ui->centralWidget->hide();
widget = new TestWidget(this);

显示的效果就不再截图了,就是在当前的Window展示另一个Widget的ui界面,做界面切换也可以采用这种显示隐藏的方式来做。

QDialog

对话框一般是用于与用户交互,比如消息对话框(提示框、确认框等)、文件选择、颜色选择或者是常用的像弹框表单啊详情界面啊之类的。

对话框分为模态和非模态(说白点儿就是让不让你点别的地方)。

新建个Dialog试下效果,之后还是给Widget那个类似,声明然后实现。

如果不是在dialog类的初始化就做显示,这里new完之后还是需要手动show()一下,所有的Widget都有show(),hide()等方法,具体使用可以自己摸索。

1
2
dialog = new TestDialog();
dialog->show();

Widget常用方法

比如说,不想要标题栏,任务栏不显示,置顶等等,可以参照下面。

1
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
WindowsFlags效果
Qt::FramelessWindowHint去掉标题栏
Qt::Tool任务栏不显示
Qt::WindowStaysOnTopHint置顶
Qt::WindowMinimizeButtonHint显示最小化按钮
Qt::WindowMaximizeButtonHint显示最大化按钮
Qt::WindowMinMaxButtonsHint显示最小最大化按钮
Qt::WindowCloseButtonHint显示关闭按钮

其他的后续用到再补充吧。

小结

基本上窗体这块儿就聊这么多吧,每个里面其实展开来搞还是有一大堆东西,不过三个类有区别但是毕竟都是同父,相似之处还是挺多,鼓捣时间长了就熟了。


Qt 系列(三)——窗体
http://www.aprilblank.top/qt/win.html
作者
AprilBlank
发布于
2022年6月24日
许可协议