信号与槽函数是QT的一大创新,通过自定义信号与槽函数可以实现自己想实现的功能。
标准的信号与槽写法如下:connect(&button,&QPushButton::clicked,this,&QWidget::close);
参数说明:
(1) &button :信号发出者,指针类型
(2)&QPushButton::clicked :处理的信号, &发送者的类名::信号名字 (不用加函数括号,只需要名字即可)这里说的是button的点击操作
(3) this : 信号接收者 ,指针类型 这里指的是当前窗口
(4)&QWidget::close :&接收者的类名::槽函数名字
自定义槽函数,
普通函数的用法,任意的成员函数,普通全局函数,静态函数都可以作为槽函数
槽函数需要和信号一致(参数,返回值)由于信号都是没有返回值,所以槽函数一般都没有返回值
自定义信号,信号必须有signals关键字来声明
信号没有返回值,但可以有参数,信号就是函数的声明,只需声明,无需定义
使用:emit (一般都是通过自定义槽函数发送信号出去)
来举例说明,建立一个窗口和另一个窗口,一个作为 父窗口,另一个作为 子窗口,每个窗口上面 设置按钮,发生点击信号响应当前窗口隐藏,另一个窗口显示。
Headers 头文件
(1)sonwidget.h文件:
#ifndef SONWIDGET_H
#define SONWIDGET_H
#include
#include
class Sonwidget : public QWidget
{
Q_OBJECT
public:
explicit Sonwidget(QWidget *parent = nullptr);
QPushButton *button2;
//自定义信号
signals:
//信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
void show_hide_singal(int a);
//自定义槽函数
public slots:
void emit_mysignal();
};
#endif // SONWIDGET_H
(2)widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include
#include "sonwidget.h"
#include "QPushButton"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
//类成员变量
Sonwidget *sonwidget;//子窗口
QPushButton *button1;//按钮
//自定义的槽函数
public slots:
void button_click1();//按钮响应的槽函数
void signal();//子窗口响应的槽函数
};
#endif // WIDGET_H
Sources文件
(1)main.cpp
#include "widget.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
(2)sonwidget.cpp文件
#include "sonwidget.h"
#include "QPushButton"
Sonwidget::Sonwidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("子窗口");
//设置按钮
button2=new QPushButton("显示父窗口,隐藏子窗口",this);
//设置连接,子窗口,子窗口的信号为按钮的点击响应,槽函数为父窗口的自定义函数
connect(button2,&QPushButton::clicked,this,&Sonwidget::emit_mysignal);
}
void Sonwidget::emit_mysignal(){
//点击按钮的函数
emit show_hide_singal(10);
}
(3)widget.cpp文件
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//父窗口设置标题
this->setWindowTitle("父窗口");
//设置当前窗口的子窗口
this->sonwidget=new Sonwidget;
//显示子窗口
sonwidget->show();
//设置按钮
button1=new QPushButton("显示子窗口,隐藏父窗口",this);
//设置连接,父窗口上的按钮。信号为点击按钮,槽函数为父窗口的自定义函数
connect(button1,&QPushButton::clicked,this,&Widget::button_click1);
//设置连接,子窗口,子窗口的信号,槽函数为父窗口的自定义函数
connect(sonwidget,&Sonwidget::show_hide_singal,this,&Widget::signal);
}
//设置按钮连接的槽函数
void Widget::button_click1(){
//父窗口隐藏
this->hide();
//子窗口显示
this->sonwidget->show();
}
//设置子窗口连接的槽函数
void Widget::signal(){
//父窗口显示
this->show();
//子窗口隐藏
this->sonwidget->hide();
}
//类析构函数
Widget::~Widget()
{
}