目录
一、新建QT工程
二、添加新文件
三、mainwindow.h部分
四、mainwindow.ui部分
五、mainwindow.cpp部分
六、效果演示
七、改进与完善
子窗口设计后来发现有一个更简单的方法实现(用QDialog实现):传送门
一、新建QT工程
新建一个QT工程,我的工程命名为csdn,创建完成后可以看到只有主窗口mainwindow的相关文件(mainwindow.h、mainwindow.cpp、mainwindow.ui)
二、添加新文件
按照以下步骤添加新的文件:
1.新建文件
2.选择 " QT > Qt Widgets Designer Form class > 选择 "
3.选择 widge 并完成命名(childwindow)
4.新建完成后可以看到项目中增加了子窗口childwindow的相关文件(childwindow.h、childwindow.cpp、childwindow.ui)此时和主窗口一样可以进行ui设计。
三、mainwindow.h部分
文件头部加入childwindow.h文件声明
#include "childwindow.h" 在Private栏下加入定义好子窗口,并置空指针
private:Ui::MainWindow *ui;childwindow *childwindow_ui = nullptr;
四、mainwindow.ui部分
1.在mainwindow设计中:添加一个按钮pushButton,并设置文本“打开子窗口”
2.右键该按钮点击“转到槽”,再选择“clicked()”
3.接着会自动连接信号与槽,并自动跳转到mainwindow.cpp内槽函数位置。
五、mainwindow.cpp部分
在该槽函数中写入如下代码:
void MainWindow::on_pushButton_clicked()
{if(!childwindow_ui){childwindow_ui = new childwindow(this);childwindow_ui -> show();}
}
六、效果演示
点击子窗口按钮后会弹出子窗口:
七、改进与完善
虽然简单功能已经实现,但是存在一个问题:当关闭子窗口后,再次点击主窗口按钮时,子窗口不会再次弹出,因此需要进一步完善,所用的具体方法是:重写子窗口closeEvent。
这里不详细说明直接给出完整的代码:
mainwindow.h代码#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "childwindow.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked() ; //点击打开子窗口按钮的槽函数void childwindow_close() ; //关闭子窗口函数(关闭窗口时指针将置空)private:Ui::MainWindow *ui;childwindow *childwindow_ui = nullptr;
};
#endif // MAINWINDOW_H
childwindow.h代码#ifndef CHILDWINDOW_H
#define CHILDWINDOW_H#include <QMainWindow>
#include <QCloseEvent>namespace Ui {
class childwindow;
}class childwindow : public QMainWindow
{Q_OBJECTpublic:explicit childwindow(QWidget *parent = nullptr);~childwindow();signals:void closed(); // 当窗口关闭时发送的信号protected:void closeEvent(QCloseEvent *event) override; // 重写closeEventprivate:Ui::childwindow *ui;
};#endif // CHILDWINDOW_H
mainwindow.cpp代码#include "mainwindow.h"
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{if(!childwindow_ui){this->setEnabled(false);//禁用主窗口childwindow_ui = new childwindow(this);connect(childwindow_ui, &childwindow::closed,this,&MainWindow::childwindow_close); //连接主窗口close信号到主窗口槽函数childwindow_ui -> show();}
}void MainWindow::childwindow_close()//当子窗口关闭时,将指针置空并启用主窗口
{childwindow_ui = nullptr;this->setEnabled(true);
}
childwindow.cpp代码#include "childwindow.h"
#include "ui_childwindow.h"childwindow::childwindow(QWidget *parent): QMainWindow(parent), ui(new Ui::childwindow)
{ui->setupUi(this);
}childwindow::~childwindow()
{delete ui;
}void childwindow::closeEvent(QCloseEvent *event)
{emit closed(); // 发射关闭信号QWidget::closeEvent(event); // 继续默认的关闭处理
}