Qt多窗口设计:主窗口点击按钮打开子窗口
创作时间:
作者:
@小白创作中心
Qt多窗口设计:主窗口点击按钮打开子窗口
引用
CSDN
1.
https://blog.csdn.net/2303_76814451/article/details/142600191
目录
一、新建QT工程
二、添加新文件
三、mainwindow.h部分
四、mainwindow.ui部分
五、mainwindow.cpp部分
六、效果演示
七、改进与完善
一、新建QT工程
新建一个QT工程,工程命名为myproject,创建完成后可以看到只有主窗口mainwindow的相关文件(mainwindow.h、mainwindow.cpp、mainwindow.ui)
二、添加新文件
按照以下步骤添加新的文件:
- 新建文件
- 选择 " QT > Qt Widgets Designer Form class > 选择 "
选择 widge 并完成命名(childwindow)
新建完成后可以看到项目中增加了子窗口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部分
在mainwindow设计中:添加一个按钮pushButton,并设置文本“打开子窗口”
右键该按钮点击“转到槽”,再选择“clicked()”
接着会自动连接信号与槽,并自动跳转到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_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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_OBJECT
public:
explicit childwindow(QWidget *parent = nullptr);
~childwindow();
signals:
void closed(); // 当窗口关闭时发送的信号
protected:
void closeEvent(QCloseEvent *event) override; // 重写closeEvent
private:
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); // 继续默认的关闭处理
}
热门推荐
Windows 11系统热键冲突解决方案:详细设置教程
新手跑者必看:如何挑选完美跑鞋,防护兼顾多场景适用
岁星神的守护:深入中国传统太岁信仰
音乐风格你知道多少?
盘点《封神演义》中牛类神兽坐骑:青牛、奎牛、五色神牛的解析
计算机哈佛架构、冯·诺依曼架构对比
正念养育的力量:不做情绪失控的家长!
张雪峰:文科男生的四大优势赛道与弯道超车策略
八国联军侵华:一段不能忘却的历史
初识运放 - 运放的基本工作原理介绍
中水回用设备应用领域广泛助力各行业可持续发展
贝斯吉他和吉他哪个更难学?全方位对比分析
机器视觉在航空航天中如何提升图像识别精度
怎么治疗鼻翼两侧的脓包型痤疮
【2024 ASCO GI】瑞派替尼二线治疗带来生存获益,且不影响后续TKI治疗
每天三分钟燃脂减肥(每天三分钟燃脂减肥健身操)
语言艺术:掌握精准表达与交流的核心要素
为啥秋天树叶会变红?
亚龙湾精华游:热门景点更优游览顺序指南
梁思成发现唐代佛光寺东大殿80年,文物界制定十年保护方案
历史评说——李善长忠臣身份的探讨
弘扬中医药文化之医著篇:《神农本草经》
被忽视的内感觉:从心理学到筋膜医学
李善长:明朝第一功臣的悲剧命运
有思想的学问家——关于章太炎
户外运动背包选购指南:从容量到防水性能全方位解析
古埃及的奥西里斯神与生命与重生的象征意义
步摇与簪子:中国古代女性头饰的两种美学
闽人智慧丨从替父还债到南洋首富,陈嘉庚的从商秘诀在于这两个字
重磅|2024年度十大救捞案例公布