当前位置:首页 » 《我的小黑屋》 » 正文

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

5 人参与  2024年10月19日 10:03  分类 : 《我的小黑屋》  评论

点击全文阅读


目录

一、新建QT工程

二、添加新文件

三、mainwindow.h部分

四、mainwindow.ui部分

五、mainwindow.cpp部分

六、效果演示

七、改进与完善


一、新建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_NAMESPACEnamespace 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://zhangshiyu.com/post/173974.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1