Qt_day6_多窗口编程

目录

多窗口编程

1. 继承结构(熟悉)

2. QMessageBox 消息对话框(掌握)

3. QStackedWidget 堆栈窗口(掌握)

4. QMainWindow 主窗口类(掌握)

4.1 QMenuBar 菜单栏

4.2 QToolBar 工具栏

4.3 QWidget 中心组件

4.4 QStatusBar 状态栏

5. parent参数(掌握)

6. 自定义窗口类(掌握)

6. 窗口传参(对象传参)(掌握)

6.1 主窗口(父对象) → 子窗口(子对象)

6.2 子窗口(子对象)→ 主窗口(父对象)

7. 事件(掌握)

7.1 机制

7.2 事件函数


多窗口编程

    之前的Qt编程都是在一个预设的Dialog窗口(窗体)中进行的,实际一个项目可以有多个窗口,也可以有不同的窗口类型,本章讲解窗口相关的功能。

1. 继承结构(熟悉)

   所有的窗口类均继承自QWidget类,因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口,又可以作为组件(子窗口)。

通过构造函数可以创建以上两种形态的QWidget:

QWidget作为独立窗口的基类,内部常用的相关功能如下:

  • windowFlags : Qt::WindowFlags

窗口标记,可以设置一些枚举值,给窗口不同的显示效果,如果要同时设置多个标记,可以使用 | 分隔。

下面是一些常见标记:

windowTitle : QString

窗口标题栏文字

  • 窗口状态(非属性)

窗口状态也是枚举值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的分享

【课后拓展】

事件与信号槽的区别?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值