Qt5学习——点击同一个按钮实现打开与关闭一个子窗口

需求:在主窗口中点击【打开】按钮后,弹出一个子窗口,同时按钮上的文字变成【关闭】,再次点击即可关闭子窗口!
分析:其实弹出子窗口并不难实现,关键是同一个按钮实现打开与关闭的功能,这个需要注意实现的方式以及一些细节,需要用到lambda表达式,具体步骤如下:
1、首先新建一个项目,创建一个空窗口文件,如下图1所示,然后鼠标右键点击项目,选择添加新文件,选择C++ Class类型,然后选择基于QWidget,创建一个名为childWin的子窗口文件,如下图2所示。
在这里插入图片描述
在这里插入图片描述
2、在widget.h文件添加的代码如下,其中选择在主窗口类中的public中创建按钮和子窗口对象是为了能够全局使用,可以在槽函数中使用这些对象。

#include <QWidget>
#include "childwin.h"
#include <QPushButton>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    //创建按钮对象和子窗口对象
    QPushButton *btn;
    childWin *win;
    //弹出/关闭子窗口的槽函数
    void showChildWin();
    
private:
    Ui::Widget *ui;
};

3、在widget.cpp文件中的代码如下,自己添加的基本都有注释,我会挑几个关键的代码讲。首先是初始化按钮和子窗口的对象,将按钮初始文字设置成【开始】;在槽函数中定义功能,获取按钮文本,是【打开】则点击后弹出子窗口,【关闭】则点击后关闭窗口;最后是连接信号和槽,并实现点击【开始】按钮后文字变成【关闭】,这一步我使用的是lambda表达式,可以直接在connect中定义这些功能,其中this->showChildWin();是调用槽函数,点击按钮出发信号就会调用该函数,然后使用btn->setText(“关闭”);将按钮文字改变,这样再次点击就会关闭子窗口了!运行结果如下图所示:

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#pragma execution_character_set("utf-8"); //如果中文出现乱码加上这行!!!

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //定义主窗口大小
    resize(380,300);
    setWindowTitle("主窗口");
    //创建一个子窗口对象
    this->win = new childWin;
    win->resize(350,200);
    win->setWindowTitle("子窗口");
    //创建一个按钮对象
    this->btn = new QPushButton("打开",this);
    btn->move(100,80);
    //连接信号和槽,利用lambda表达式改变按钮上的文字
    connect(btn,&QPushButton::clicked,this,[=](){
        this->showChildWin();
        btn->setText("关闭");
    });
    //connect(btn,&QPushButton::clicked,this,&Widget::showChildWin);
}
//定义弹出子窗口的槽函数
void Widget::showChildWin()
{
    if(btn->text()=="打开")
        win->show();
    if(btn->text()=="关闭")
        win->close();
}

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

在这里插入图片描述
在这里插入图片描述
4、注意:在connect()中用到lambda表达式是因为你不能将btn->setText(“关闭”);这句放到槽函数中的win->show();后面,因为系统是按顺序读程序的,你立马设置成【关闭】就会立即执行win->close();,结果就是点击按钮打开子窗口后就会自动关闭,而不是再次点击按钮后关闭!这点要注意!还有就是不能在槽函数中初始化子窗口,不然再次点击按钮就会新建一个子窗口弹出,而不是关闭之前的子窗口噜!

发布了17 篇原创文章 · 获赞 3 · 访问量 1799

猜你喜欢

转载自blog.csdn.net/weixin_43350361/article/details/105146300