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

Qt弹出新窗口并关闭(一个按钮)

参考:Qt基础 练习:弹出新窗口并关闭的两种实现方式(两个按钮、一个按钮)_qt打开一个窗口另一个关闭-CSDN博客

实现:

一个按钮,点击一次,按钮的名字从open window变为close window,并且弹出一个新窗口;

再次点击,按钮名字从close window变为open window,并且关闭新窗口

目录

1.新建项目,添加新文件

2.声明函数

3.函数实现

4.创建按钮和连接

5.运行结果

6.完整代码


1.新建项目,添加新文件

输入新建文件名

2.声明函数

这个函数既可以打开新窗口也可以关闭新窗口

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QWidget>

class myWindow : public QWidget
{
    Q_OBJECT
public:
    explicit myWindow(QWidget *parent = nullptr);
    void OCWindow();
    QWidget *n=new QWidget;
    bool jud=false;

signals:
};

#endif // MYWINDOW_H

3.函数实现

思考:怎样让一个函数实现两种相反的功能呢?

我们可以增加一个bool型变量来控制打开和关闭,这便让一个按钮实现了两种功能

代码:

#include "mywindow.h"
#include"qwidget.h"

myWindow::myWindow(QWidget *parent)
    : QWidget{parent}
{}

void myWindow::OCWindow()
{
    //判断按钮此时的状态,并且执行打开或关闭操作
    if(jud==false)
    {
        n->setWindowTitle("The second window");
        n->show();
        jud=true;
    }
    else
    {
        n->close();
        jud=false;
    }
}

4.创建按钮和连接

创建:

连接(使用Lambda表达式):

代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"QPushButton"
#include"mywindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->n=new myWindow(this);

    this->resize(600,400);

    //创建按钮
    QPushButton *btn=new QPushButton;
    btn->setParent(this);

    setWindowTitle("Open or Close");

    btn->resize(100,50);
    btn->move(235,135);
    btn->setText("open window");

    bool jud=false;

    //连接,使用Lambda表达式
    connect(btn,&QPushButton::clicked,this,[=,&jud](){
        n->OCWindow();
        if(jud==false)
            {
            jud=true;
            btn->setText("close window");
        }
        else
            {
            jud=false;
            btn->setText("open window");
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

5.运行结果

6.完整代码

mywindow.h

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QWidget>

class myWindow : public QWidget
{
    Q_OBJECT
public:
    explicit myWindow(QWidget *parent = nullptr);
    void OCWindow();
    QWidget *n=new QWidget;
    bool jud=false;

signals:
};

#endif // MYWINDOW_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<mywindow.h>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    myWindow *n;
};
#endif // MAINWINDOW_H

mywindow.cpp

#include "mywindow.h"
#include"qwidget.h"

myWindow::myWindow(QWidget *parent)
    : QWidget{parent}
{}

void myWindow::OCWindow()
{
    //判断按钮此时的状态,并且执行打开或关闭操作
    if(jud==false)
    {
        n->setWindowTitle("The second window");
        n->show();
        jud=true;
    }
    else
    {
        n->close();
        jud=false;
    }
}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"QPushButton"
#include"mywindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->n=new myWindow(this);

    this->resize(600,400);

    //创建按钮
    QPushButton *btn=new QPushButton;
    btn->setParent(this);

    setWindowTitle("Open or Close");

    btn->resize(100,50);
    btn->move(235,135);
    btn->setText("open window");

    bool jud=false;

    //连接,使用Lambda表达式
    connect(btn,&QPushButton::clicked,this,[=,&jud](){
        n->OCWindow();
        if(jud==false)
            {
            jud=true;
            btn->setText("close window");
        }
        else
            {
            jud=false;
            btn->setText("open window");
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

相关文章:

  • Leetcode 四数之和
  • IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题
  • docker中安装 python
  • Go 语言规范学习(3)
  • 5.0 WPF的基础介绍1-Grid,Stack,button
  • 同级目录下的两个文件怎么import
  • ngx_http_core_main_conf_t
  • DeepSeek-R1 模型现已在 AWS 平台上正式上线
  • SSE SseEmitter.completeWithError(e) 触发的处理逻辑
  • 使用 PowerShell 脚本 + FFmpeg 在 Windows 系统中批量计算 MP4视频 文件的总时长
  • (C语言)文本动态通讯录(动态通讯录升级版)(C语言小项目)
  • macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法
  • 使用 rsync 进行服务器文件同步与优化
  • STM32基础教程——输入捕获模式测量PWM频率
  • SD(Stable Diffusion)模型学习图谱
  • 视频生成的测试时Scaling时刻!清华开源Video-T1,无需重新训练让性能飙升
  • 内网YUM源搭建手册(Internal Network yum Source Construction Manual)
  • c++ primer 阅读手记 第六章
  • RCE——回调后门
  • 【ADC测试】在ADC马密度的方式测试INL和DNL
  • 内网 做 网站/百度关键词怎么排名
  • 装饰公司怎样做网站/无锡seo培训
  • 聊城企业做网站推广/常见的网站推广方法有哪些
  • 杭州盘石做网站专业吗/长春seo结算
  • 企业门户网站开发代码/大连seo网站推广
  • 品牌型网站设计/企业seo的措施有哪些