QT:多窗口设计(主窗口点击按钮打开子窗口)

embedded/2025/2/5 4:21:09/

目录

一、新建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); // 继续默认的关闭处理
}


http://www.ppmy.cn/embedded/159654.html

相关文章

使用IDEA社区版搭建Springboot、jsp开发环境

1&#xff0c;感觉传统的JSP可以放弃&#xff0c;直接前端JS后端就可以了 2&#xff0c;建议不要用低版本的springboot&#xff0c;版本兼容搭配太麻烦 如果仅仅是搭建springboot开发环境&#xff0c;没什么难度&#xff0c;本文主要记录以下几个问题的解决&#xff1a; 1&…

DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力

论文链接&#xff1a; [2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 实在太长&#xff0c;自行扔到 Model 里&#xff0c;去翻译去提问吧。 工作原理&#xff1a; 主要技术&#xff0c;就是训练出一些专有用途小模型&…

c++ list的front和pop_front的概念和使用案例—第2版

在 C 标准库中&#xff0c;std::list 的 front() 和 pop_front() 是与链表头部元素密切相关的两个成员函数。以下是它们的核心概念和具体使用案例&#xff1a; 1. front() 方法 概念&#xff1a; 功能&#xff1a;返回链表中第一个元素的引用&#xff08;直接访问头部元素&am…

257. 二叉树的所有路径

二叉树的所有路径 已解答 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“1->2->5”,“…

HTB:UnderPass[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机UDP开放端口进行脚本、服务扫描 …

Python玄学

过年期间无聊的看了看DY直播&#xff0c;也是迷上玄学了。突然想着为啥要自己掐指算&#xff0c;我这&#x1f437;脑哪记得到那么多东西啊。然后&#xff0c;就捣鼓捣鼓了一些玩意儿。留个纪念。 注&#xff1a;就是一个玄学推动学习&#xff0c;部分内容不必当真&#xff0c;…

三傻排序的比较(选择,冒泡,插入)

在学习排序算法时&#xff0c;选择排序、冒泡排序和插入排序是最常见的基础排序算法。但是&#xff0c;尽管这些算法看起来非常相似&#xff0c;它们在实际应用中的效率和性能却有所不同。本文将详细比较这三种排序算法的时间复杂度、空间复杂度。 比较总结 排序算法时间复杂…

如何在5步内使用 Spring AI 和 OpenAI 的 DALL-E 3 生成图像

将 Spring AI 与 OpenAI 的 DALL-E 3 集成&#xff0c;以生成图像。轻松设置 Spring Boot、配置 API 集成并自定义设置。 大家好&#xff01;这是关于 Spring AI 系列介绍文章的第一篇。今天&#xff0c;我们将了解如何通过文本提示轻松生成图片。为此&#xff0c;我们将利用 …