Qt开发基础(2)——自定义槽函数实现两个窗口的相互切换

这篇博客详细介绍了如何在Qt环境中通过信号与槽机制实现两个窗口之间的切换。首先,通过新建文件创建子窗口类,并设置基类为QWidget。然后,定义子窗口的槽函数和信号,在子窗口中添加按钮并与其槽函数关联。在主窗口中,创建子窗口对象,设置按钮点击事件,通过connect函数连接信号和槽,实现在点击按钮时隐藏当前窗口并显示子窗口。同时,处理子窗口的信号,当子窗口触发信号时,隐藏子窗口并显示主窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.建第二个窗口的方法

选中项目名SignalAndSlot--->右击“添加新文件”:

                

                 

        class name 我填写的是SubWidget ,然后base class基类选择QWidget

                                         

我们可以发现多了两个文件。

2.实现点击按钮两个窗口相互切换

在subwidget.h中添加一个按钮属性

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);
    void sendSlot();//子窗口的槽函数定义

signals:
/*
信号必须有signals关键字来声明
信号没有返回值,但可以有参数
信号就是函数的声明,只需要声明,无需定义
使用:emit mySignal();
*/
    void mysignal();
private:
    QPushButton b;

};

#endif // SUBWIDGET_H

在subwidget.cpp中

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("小弟");//也可以这样写this-> setWindowTitle("小弟");
    b.setParent(this);
    b.setText("切换到主窗口");
    connect(&b, &QPushButton::released,this,&SubWidget::sendSlot);//在子窗口只是和主窗口建立链接,真正的实现效果在主窗口设定

    resize(400,300);
}

void SubWidget::sendSlot()
{
    emit mysignal();
}

mainwidget.h主头文件中

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include<QPushButton>
#include"subwidget.h" //倒入子窗口头文件

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
    void mySlot();
    void changeWin();
    void dealSubWin();//处理子窗口

private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w;//创建子窗口类的对象
};
#endif // MAINWIDGET_H

 主源文件中:

#include "mainwidget.h"
#include<QPushButton>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("取消");
    b1.move(100,100);

    //b2是一个指针,需要动态分布空间
    b2 = new QPushButton(this);//通过构造函数指定父对象
    b2->setText("abc");

    //点击“取消”按钮就关闭
    /*
    connect()建立连接函数:
    (1)&b1:信号发出者,必须是指针类型,如果要是把b2按退出就应该改为b2不需要加&,因为b2本身就是指针类型
    (2)&QPushButton::pressed:表示处理的信号.格式为:&发送者的类名::信号的名字
    (3)this:信号的接收者
    (4)&MainWidget::close:槽函数,信号处理函数。 格式为:&接收者的类名::槽函数的名字
    */
    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);

    //自定义槽之前先进信号看看是否有返回值和参数,再定义槽函数
    //实现按下抬起的abc按钮的时候,按钮的文本变为123
    //released表示按下抬起的时候
    connect(b2, &QPushButton::released,this,&MainWidget::mySlot);
    //如果我们不让this接收,也可以让b1接收,改为如下:按b2当抬起的时候把b1隐藏
    connect(b2, &QPushButton::released,&b1,&QPushButton::hide);

    setWindowTitle("老大");
    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50,50);

    //显示子窗口
//    w.show();

//完成案例:当我们按下抬起“切换”的按钮的时候,首先隐藏当前的窗口,然后要展现子窗口(这是完成两部,所以需要自定义槽函数)
    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口的信号
    connect(&w,&SubWidget::mysignal,this,&MainWidget::dealSubWin);
    resize(400,300);

}

void MainWidget::mySlot()
{
    b2->setText("123");
}

void MainWidget::changeWin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}

void MainWidget::dealSubWin()
{
    w.hide();
    this->show();
}

MainWidget::~MainWidget()
{
}

 main.cpp中

#include "mainwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;//执行MainWidget的构造函数
    w.show();
    return a.exec();
}

 

点击切换后会切换到小弟的窗口

 在小弟窗口点击切换又切换到老板窗口

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值