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();
}
点击切换后会切换到小弟的窗口
在小弟窗口点击切换又切换到老板窗口