一、定义
(一)QWidget是大部分可视控件的基类,对比一些其他常用的类
1、QObject:这是爷爷辈的,Qt所有类的基类;
2、QMainWindow、QDialog:这是两兄弟是QWidget的孩子;
(二)在新建工程时Qt编译环境会让我们选择建立QWidget、QMainWindow、QDialog中的哪种窗口,这里解释下在使用时的区别
1、QMainWindow 这个类最大的特点就是有上面的菜单栏、工具栏等,也就是我们常见的窗口。
2、QDialog顾名思义是个对话框,Qt官方文档对对话框的定义是:A dialog window is a top-level window mostly used for short-term tasks and brief communications with the user. 翻译成中文是:对话窗口是顶级窗口,主要用于短期任务和与用户的简短通信。
(三)国际惯例,说到对话框就要介绍以下模态和非模态
1、模态:弹出来就不能点击其他窗口;
2、非模态:弹窗后还能点击其他窗口;
QDialog* pDlg | 类外实例化 | 类内设置 |
模态 | pDlg->exec() | setModal(true) |
非模态 | pDlg->show() | setModal(false) |
3、另外很多使用对话框的场景会根据用户是否点击确认来决定下一步的操作,这里可以信号槽处设置当用户点击确定或接受时调用accept()方法,使用示例如下图所示。
// 自定义对话框类
SetDialog::SetDialog(QWidget* parent) : QDialog<QDialog>(parent)
{
......
QObject::connect(pConfirmButton, SIGNAL(clicked()), this, SLOT(onAcceptMsgBox()));
}
void SetDialog::onAcceptMsgBox()
{
this->accept(); // 如果点击确定表示接受该项选择
this->close();
}
// 使用时
SetDialog* pSetDlg;
int32_t nRes = pSetDlg->exec();
(四)初谈界面美化(装X)
我们心目中的界面是这样的 ⬇(盗几张图)
或者这样的 ⬇
但很多人做出来的界面是这样的 ⬇
延续刚刚说的QMainWindow和QDialog,他们为开发者提供了窗口和顶层对话框的基本样式,也就是说默认的布局控件已经做好了,使用这些样式会很方便,但定制性不够。那么QWidget呢?其实就是一个白板。
我们可以通过对白板进行规划(布局)划分区域,在每个区域中添加各种按钮(控件),每种按钮添加背景样式(QSS)就可以做出来炫酷的界面,换句话说市面上很多成熟的软件都是开发者从白板规划出来的,而没有采用直接用QMainWindow和QDialog(即使有也会用setWindowFlags()方法隐去各种控件)。
例如下图的战网客户端(只是一个简单介绍,说到布局再详细讲解):
使用垂直划分为:黄色区域+绿色区域;分别在各区域中添加QWidget或QLabel
下方的绿色区域水平划分为:红色区域+蓝色区域;分别在各区域中添加QWidget或QLabel
左侧游戏图标组成的列表可以选择使用QTableWidget控件,设置属性N行1列,隐藏表头。
(以上只是一个针对初学者的例子,不过听说战网是确实是用Qt做的,如果没被打包或者静态编译应该可以找到Qt的几个Dll把)
二、使用方法
(一)设置大小
方法 | 作用 | 要点 |
setSize() | 设置大小 | |
resize() | ||
setFixedSize() | 固定长宽,单位像素 | |
setFixedHeight() | ||
setFixedWidth() | ||
setMinimumSize() | 最大长宽,单位像素 | |
setMinimumHeight() | ||
setMinimumWidth() | ||
setMaximumSize | 最小长宽,单位像素 | |
setMaximumHeight() | ||
setMaximumWidth() | ||
setSizePolicy() | 控制拉伸策略 | 控件必须在布局中 |
(二)设置标题栏
方法 | 作用 | 要点 |
setWindowIcon() | 设置标题栏图标 | |
setWindowTitle() | 设置标题栏标题 | |
setWindowFlags() | 定制标题栏 | 包含隐藏标题、图标、按钮等设置 |
(三)设置菜单栏和工具栏(QMainWindow)
方法 | 作用 | 要点 |
setMenuBar() | 添加一个菜单栏 | |
setMenuWidget() | 添加自定义标题栏 | 参数是QWidget,适合自定义菜单栏 |
addToolBar() | 增加工具栏 | |
insertToolBar(); | 插入工具栏按钮 | 插入到置顶工具栏的后面 |
removeToolBar() | 移除工具栏 | |
addSeparator() | 工具按钮的间隔 | |
insertSeparator() | 工具按钮的间隔 | |
setMovable() isMovable() allowedAreas() isAreaAllowed() | 用来设置工具栏移动的范围和政策 |
相关Qt官方文档和其他参考:(Qt文档还是很不错的)
https://doc.qt.io/qt-5/qwidget.html
https://doc.qt.io/qt-5/qmainwindow.html
https://doc.qt.io/qt-5/qtoolbar.html
(该系列第一篇博客请多指教哦)
分享一个长度度量单位:小小黑