当前位置: 首页 > article >正文

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

目录

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


http://www.kler.cn/a/512854.html

相关文章:

  • Kotlin协程中withContext、async 和 launch 的区别
  • python milvus及curl命令进行query请求
  • 2025年1月17日(点亮一个 LED)
  • mybatis的多对一、一对多的用法
  • 解决用 rm 报bash: /usr/bin/rm: Argument list too long错
  • 第15章:Python TDD应对货币类开发变化(二)
  • 开源的Text-to-SQL工具WrenAI
  • SQL Server2022版详细安装教程(Windows)
  • 有线通信方式(I2C、UART、RS485)
  • 【Red Hat8】:搭建FTP服务器
  • springboot接入deepseek深度求索 java
  • vue3使用音频audio标签
  • 可视化平台建设技术方案,商业BI系统解决方案,大屏建设功能需求分析(word原件)
  • Datawhale组队学习笔记task2——leetcode面试题
  • 前〈和平精英〉技术策划进军AI游戏领域,获新投资
  • 【数据结构】搜索二叉树
  • 【有啥问啥】什么是端到端(End-to-End)?
  • 【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling
  • 【Linux】Linux入门(4)其他常用指令
  • 基于Docker的Kafka分布式集群
  • leetcode——和为K的子数组(java)
  • 【配置环境】VS Code中JavaScript环境搭建
  • Ubuntu22.04系统切换内核版本
  • 【论文投稿】探秘嵌入式硬件设计:从原理到代码实战
  • 计算机视觉模型的未来:视觉语言模型
  • java快速导出word文档