QT自定义信号与槽
创建发送者与接收者
右键点击项目名选择添加新文件,之后选择添加C++ Class
之后再输入类命、选择基类后,一路下一步即可
添加信号与槽
添加信号
在发送者类的头文件中添加信号函数声明即可
class Sender : public QObject
{
Q_OBJECT
public:
explicit Sender(QObject *parent = nullptr);
signals:
void sendSignal();
};
添加槽
先在接收者类的头文件中添加槽函数声明
class Sendee : public QObject
{
Q_OBJECT
public:
explicit Sendee(QObject *parent = nullptr);
signals:
public slots:
void receiveSignal();
};
再到接收者类的源文件中实现槽函数功能
#include <QDebug>
void Sendee::receiveSignal() {
qDebug()<<"We have received the signal.";
}
此时实际自定义信号与槽的工作已完成
实现信号的调用发送
widget头文件(widget.h)
#include "sender.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
Sender* sder = nullptr; //创建发送者指针
void emitSignal(); //声明发送函数
};
widget源文件(widget.cpp)
#include "sendee.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
sder = new Sender(this); //实例化发送者对象
Sendee* sdee = new Sendee(this); //创建接收者对象
//连接信号与槽
connect(sder, &Sender::sendSignal, sdee, &Sendee::receiveSignal);
emitSignal(); //调用发送函数
}
void Widget::emitSignal() { //实现发送函数
emit sder->sendSignal(); //发送信号
}
实现效果:
信号连接
所谓信号连接,就是用一个信号去唤醒调用另一个信号。
方式一:
#include <QPushButton>
#include "sendee.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
sder = new Sender(this); //实例化发送者对象
Sendee* sdee = new Sendee(this); //创建接收者对象
//连接信号与槽
connect(sder, &Sender::sendSignal, sdee, &Sendee::receiveSignal);
QPushButton *btn = new QPushButton("发送", this);
//让按钮点击事件去唤醒信号发送函数
connect(btn, &QPushButton::clicked, this, &Widget::emitSignal);
}
void Widget::emitSignal() { //实现发送函数
emit sder->sendSignal(); //发送信号
}
方式二:
#include <QPushButton>
#include "sendee.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
sder = new Sender(this); //实例化发送者对象
Sendee* sdee = new Sendee(this); //创建接收者对象
//连接信号与槽
connect(sder, &Sender::sendSignal, sdee, &Sendee::receiveSignal);
QPushButton *btn = new QPushButton("发送", this);
//让按钮点击事件直接去唤醒信号
connect(btn, &QPushButton::clicked, sder, &Sender::sendSignal);
}
实现效果: