QT(二):简单多窗口程序

原文地址:https://houkaifa.com/2019/02/19/LearningNotes-QT-02/

概述

本篇记录如何通过 QT Creator 开发一个简单的多窗口程序。
环境:Win10 + QT Creator4.4.1 + QT5.9.2。
实现内容:在主窗口中输入指定的口令,点击按钮载入另一个窗口,并给出了子窗口只允许同时载入一次的三种方法。

QT(二):简单多窗口程序_第1张图片


一、建立 QT 项目

打开 QT Creator,新建 Qt Widget Application 项目。

QT(二):简单多窗口程序_第2张图片

设置项目名称,一直下一步完成项目创建。

QT(二):简单多窗口程序_第3张图片

下图是初始的工程结构:

QT(二):简单多窗口程序_第4张图片

二、添加新的GUI文件

在项目目录中选中 Forms 右键,添加新文件。

QT(二):简单多窗口程序_第5张图片

在新建文件窗口中选择 Qt 类,Qt 设计师界面类,确定。

QT(二):简单多窗口程序_第6张图片

按照实际需要选择界面模板,此处选择的依旧是 Main Window,下一步。

QT(二):简单多窗口程序_第7张图片

默认的类目还是 MainWindow,为了避免与主窗口冲突,重新选择类名,一路下一步,完成。

QT(二):简单多窗口程序_第8张图片

新的 Qt 设计器界面类创建完成后的工程结构:

QT(二):简单多窗口程序_第9张图片

三、窗口载入的实现

打开主窗口的.ui文件,添加一个 lineEdit 和一个 pushButton 做一个简陋的界面意思一下,其中 lineEdit 设置了显示方式为 Password,并设置了默认文本:

QT(二):简单多窗口程序_第10张图片

运行起来的效果是这样的:

QT(二):简单多窗口程序_第11张图片

接下来我们要实现的是,当文本框中的内容为指定内容,如 Houkaifa 时,点击确认按钮载入窗口 ChildWindow。

首先,我们在主窗口的.h文件中添加对子窗口的头文件包含:

#include 

并在主窗口类中定义一个子窗口类的私有成员:

private:
    ChildWindow *cw;

完整的代码看上去是这样的:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private:
    ChildWindow *cw;
};

#endif // MAINWINDOW_H

emmm,还是放图片看起来清楚些:

QT(二):简单多窗口程序_第12张图片

下面,我们为主窗口的 pushButton 添加 clicked 信号的槽函数,用以判断口令是否正确。

QT(二):简单多窗口程序_第13张图片

在口令正确的情况下,如何载入子窗口 cw?
在主窗口类中我们定义了 ChildWindow 类的一个私有成员,只需在合适的位置将其实例化,并调用show()函数进行显示即可,具体代码如图:

QT(二):简单多窗口程序_第14张图片

当然,不将子窗口类定义为类成员,直接在需要的时候创建临时变量也是可行的,例如删除 cw 的成员声明,而在上图的注释(// Load ChildWindow)处直接添加如下代码:

ChildWindow *cw = new ChildWindow(this);
cw->show(); 

F5调试程序,测试效果:

  • 输入错误口令,点击确认按钮,提示口令错误。

QT(二):简单多窗口程序_第15张图片

  • 输入正确口令,点击确认按钮,载入 ChildWindow。

QT(二):简单多窗口程序_第16张图片

--- END(假的) ---

此时你会发现,多次点击确认按钮,会载入多个 ChildWindow,如果不希望子窗口被多次同时载入,可以:

  • 方法一:在子窗口载入完成后将主窗口隐藏:
...
cw->show();	// 显示子窗口
this->hide();	// 隐藏主窗口
...
  • 方法二:将 ChildWindow 改装成单例类。

  • 方法三:像本例一样将 ChildWindow 定义为主窗口的类成员,并在子窗口被关闭后将指针置空,在点击确认按钮时验证指针状态,即可知道窗口是否已创建,详细见下文:

如何在子窗口关闭后将指针置空?
答:重写 closeEvent 事件函数。

closeEvent 是 QCloseEvent 类中的虚函数,其原型为:

void closeEvent(QCloseEvent* event);

在窗口关闭时被触发,将该类包含在子窗口的头文件中,并对 closeEvent 函数进行重写,即可实现在子窗口关闭时进行自定义操作。

QT(二):简单多窗口程序_第17张图片

接下来在子窗口的.cpp文件中对 closeEvent 函数进行实现,直接发送信号:

void ChildWindow::closeEvent(QCloseEvent* event)
{
    emit windowClosed();
}

最后补全主窗口的代码即可:

QT(二):简单多窗口程序_第18张图片

效果:

QT(二):简单多窗口程序_第19张图片

你可能感兴趣的:(学习笔记,QT)