目录
多窗口编程
之前的Qt编程都是在一个预设的Dialog窗口(窗体)中进行的,实际一个项目可以有多个窗口,也可以有不同的窗口类型,本章讲解窗口相关的功能。
1. 继承结构(熟悉)
所有的窗口类均继承自QWidget类,因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口,又可以作为组件(子窗口)。
QWidget作为独立窗口的基类,内部常用的相关功能如下:
- windowFlags : Qt::WindowFlags
窗口标记,可以设置一些枚举值,给窗口不同的显示效果,如果要同时设置多个标记,可以使用 | 分隔。
下面是一些常见标记:
窗口标题栏文字
- 窗口状态(非属性)
窗口状态也是枚举值Qt::WindowStates
// 设置窗口状态
void QWidget::setWindowState(Qt::WindowStates windowState)
常用状态如下:
通过网盘分享的文件:Day4_24072_QWidget.zip
链接: https://pan.baidu.com/s/19MwwXkR8ffhX_P-vBH5Ljw 提取码: vw6p
--来自百度网盘超级会员v7的分享
2. QMessageBox 消息对话框(掌握)
QMessageBox直接继承QDialog,是一个用于通信用户或询问用户一个问题并接受答案的模态对话框。
预设了四种类型的弹窗:
这些QDialog的派生类往往适用于一个具体的开发场景,弹窗无需创建对象,直接使用静态成员函数。
// 参数1:父窗口
// 参数2:窗口标题
// 参数3:展示信息
// 返回值:枚举,表示用户点击的按键类型
QMessageBox::StandardButton QMessageBox::critical|imformation|question|warning(
QWidget * parent,
const QString & title,
const QString & text) [static]
通过网盘分享的文件:Day4_24072_QMessageBox.zip
链接: https://pan.baidu.com/s/1Kq_Nl-xAGfAUkCjbT3TVbQ 提取码: un16
--来自百度网盘超级会员v7的分享
3. QStackedWidget 堆栈窗口(掌握)
QStackedWidget包含多个QWidget子窗口,同时只能显示一个,子窗口之间可以翻页切换显示。
通常配合QListWidget使用。
QListWidget提供信号函数:
// QListWidget当前选项发生变化时发射
// 参数为当前选项的索引
void currentRowChanged(int currentRow) [signal]
QStackedWidget提供槽函数:
// 设置显示页的索引
void setCurrentIndex(int index) [slot]
通过网盘分享的文件:Day4_24072_QStackedWidget.zip
链接: https://pan.baidu.com/s/1HLR_8ZUFa5Vazo-CEiiA_w 提取码: m5pe
--来自百度网盘超级会员v7的分享
4. QMainWindow 主窗口类(掌握)
QMainWindow是最合适作为主窗口的类型,因为包含若干组成部分:
在创建项目时,使基类为QMainWindow,主窗口就继承QMainWindow了。
4.1 QMenuBar 菜单栏
菜单栏的构成:
菜单栏可以通过Designer设计,也可以通过C++代码设计,相关函数如下:
// 在菜单栏上添加菜单
// 参数为菜单的文字
// 返回值:新添加的菜单对象
QMenu * QMenuBar::addMenu(const QString & title)
// 在菜单中添加动作
// 参数为动作的文字
// 返回值:新添加的动作对象
QAction * QMenu::addAction(const QString & text)
// 在菜单里添加菜单
// 参数为菜单的文字
// 返回值:新添加的菜单对象
QMenu * QMenu::addMenu(const QString & title)
QAction与按钮比较相似,例如与按钮类有若干相同属性:
......
QAction常用的信号函数与按钮类也相似:
回到Designer,QAction在Designer中可以通过两种方式设置属性初始值。
通过网盘分享的文件:Day4_24072_QMainWindow.zip
链接: https://pan.baidu.com/s/1GjqPc6YKw18RM0zkXtozeA 提取码: 4cwh
--来自百度网盘超级会员v7的分享
4.2 QToolBar 工具栏
工具栏上的工具按钮通常都是菜单栏里的QAction对象(设置图标),因此:
- 通过C++代码设置工具栏按钮
// 向工具栏中添加工具按钮
// 参数为设置了图标的QAction对象
void QToolBar::addAction(QAction * action)
- 通过Designer添加工具栏按钮
4.3 QWidget 中心组件
就是一个作为子窗口的QWidget对象。
4.4 QStatusBar 状态栏
状态栏可以自定义,通过文档中对应add函数增加各种自定义组件,课下感兴趣可自行拓展。预设的状态栏可以显示文本信息,相关函数如下:
// 在状态栏显示信息
// 参数1:信息内容
// 参数2:显示的毫秒数,0表示长显示
void QStatusBar::showMessage(const QString & message, int timeout = 0) [slot]
// 清除状态栏显示信息
void QStatusBar::clearMessage() [slot]
通过网盘分享的文件:Day5_24072_ToolBar.zip
链接: https://pan.baidu.com/s/11MfJnGpPnHoUvYR6CKzLDQ 提取码: h6w1
--来自百度网盘超级会员v7的分享
5. parent参数(掌握)
parent参数除了有之前父窗口的界面效果外,还体现了Qt的内存管理策略。parent参数的对象是当前创建的对象的父对象。因此在Qt中存在父对象与子对象的概念,需要注意的是,此处的父子关系与继承无关,至于parent参数有关。
子对象会跟随父对象的销毁而销毁,子对象不需要手动delete。建议绝对多数情况下传递parent参数以防止内存泄漏。
通过网盘分享的文件:Day5_24072_parent.zip
链接: https://pan.baidu.com/s/1gdFErNan_XrEipNJcpcPMA 提取码: 5r62
--来自百度网盘超级会员v7的分享
6. 自定义窗口类(掌握)
在Qt项目中新创建一个自定义窗口类的操作步骤如下:
1. 选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
3. 选择界面模板后,直接下一步。
4. 输入类名,注意不要重名。
5. 项目管理界面,直接点击完成。可以在项目中看到新的界面类的三个文件。
通过网盘分享的文件:Day5_24072_CustomWin.zip
链接: https://pan.baidu.com/s/1ccCFMR9Riqs1ObalLA5OtQ 提取码: 89z6
--来自百度网盘超级会员v7的分享
6. 窗口传参(对象传参)(掌握)
以窗口传参为例,讲解对象传参。
6.1 主窗口(父对象) → 子窗口(子对象)
【例子】在主窗口中转动QDial,数据同步到子窗口的QSlider上。
解决方案:在子对象中开一个公有接口(成员函数),父对象直接调用此接口。
6.2 子窗口(子对象)→ 主窗口(父对象)
【例子】在子窗口滑动QSlider,数据同步到主窗口的QDial上。
解决方案:子对象使用带参数的自定义信号,发送到父对象的槽函数中。
通过网盘分享的文件:Day5_24072_CustomWin (3).zip
链接: https://pan.baidu.com/s/10IrHgdz7iKoJTPMxMthCbw 提取码: kfgn
--来自百度网盘超级会员v7的分享
7. 事件(掌握)
7.1 机制
事件是Qt运行的底层逻辑,在程序运行的过程中是逐层传递,通常在Qt程序中由QApplication对象优先处理和分发。
以常见的用户操作事件为例,说明事件的传递机制。
7.2 事件函数
通过覆盖保护权限的事件虚函数,起到回调函数的效果,常见的事件如下:
// 绘制事件函数
void QWidget::paintEvent(QPaintEvent * event) [virtual protected]
// 大小改变事件函数
void QWidget::resizeEvent(QResizeEvent * event) [virtual protected]
// 鼠标按压事件函数
void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected]
// 鼠标释放事件函数
void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected]
// 鼠标双击事件函数
void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected]
// 鼠标指针移动事件函数
void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected]
// 移动事件函数
void QWidget::moveEvent(QMoveEvent * event) [virtual protected]
// 按键按压事件函数
void QWidget::keyPressEvent(QKeyEvent * event) [virtual protected]
// 按键释放事件函数
void QWidget::keyReleaseEvent(QKeyEvent * event) [virtual protected]
// 获取焦点事件函数
void QWidget::focusInEvent(QFocusEvent * event) [virtual protected]
// 失去焦点事件函数
void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected]
// 关闭事件函数
void QWidget::closeEvent(QCloseEvent * event) [virtual protected]
// 鼠标指针进入事件函数
void QWidget::enterEvent(QEvent * event) [virtual protected]
// 鼠标指针离开事件函数
void QWidget::leaveEvent(QEvent * event) [virtual protected]
通过网盘分享的文件:Day5_24072_Event (2).zip
链接: https://pan.baidu.com/s/1R1OAhrfdeIHgzwBM1Rf3zA 提取码: 8p4f
--来自百度网盘超级会员v7的分享
【课后拓展】
事件与信号槽的区别?