信号和槽就是QT对象之间的通信方式。
信号类似于发送的短信,slot 就是接收短信的手机。不管有没有手机接收,短信都是客观存在的,A手机接收到短信跟B手机接收到短信也不会有冲突。
//main.cpp 主文件,看上去非常简洁,因为所有的操作都在MainWidget的构造函数
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}
//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 = 0);
~MainWidget();
void mySlot();
void changeWin();
void dealSub();
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
SubWidget w;
};
#endif // MAINWIDGET_H
//mainwidget.cpp文件
#include "mainwidget.h"
#include<QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("CLOSE!");
b1.move(100,100);
b2= new QPushButton(this); //b2是pointer
b2->setText("abc");
/*b1是信号发出者,指针类型
处理的信号: &QPushButton::pressed &发送的类名::信号名字
this 信号接受者
slot函数处理信号: &MainWidget::close &接收的类名::槽函数名字
*/
connect(&b1, &QPushButton::pressed, this, &MainWidget::close);
/*自定义slot,即普通函数
* QT5任意的成员函数,普通全局函数,静态函数
* slot函数需要和信号一致(参数,返回值)
* 由于信号没有返回值,所以槽slot函数也没有返回值
*/
connect(b2, &QPushButton::released, this, &MainWidget::mySlot); //mySlot是类的成员函数
connect(b2, &QPushButton::released, &b1, &QPushButton::hide);
setWindowTitle("boss");
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(50,50);
//显示子窗口
// w.show();
connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);
//处理子窗口的信号
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);
resize(400,300);
}
void MainWidget::mySlot(){
b2->setText("123");
}
void MainWidget::changeWin(){
//子窗口显示
w.show();
//本窗口隐藏
this->hide();
}
void MainWidget::dealSub(){
//主窗口显示
this->show();
//子窗口隐藏
w.hide();
}
MainWidget::~MainWidget()
{
}
//subwidget的头文件
#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();
public slots:
private:
QPushButton b;
};
#endif // SUBWIDGET_H
//subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("solider");
b.setParent(this);
b.setText("切换到主窗口");
connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
resize(400,300);
}
void SubWidget::sendSlot(){
emit mySignal();
}