qt 信号与槽机制
- 信号 signal:信号的本质是事件,信号的展示方式就是函数,当某一个事件发生的时候,就会发送信号,就比如点击一个按钮,点击的时候会发出点击的信号。
- 槽 solt:就是对信号响应的函数,槽也就相当于一个函数。槽函数与普通函数不同的地方在于,槽函数可以与一个信号关联,当信号被发出时,关联的槽函数会被自动执行。信号与槽的关联需要使用到QObject::connect().
信号与槽机制底层是通过函数之间相互调用实现的,每个信号都可以用函数表示,就是信号函数。每个槽也都可以用函数表示成为槽函数。槽函数可以使用 ,private/protected/public + slots 进行修饰。
- 让我们看下qt手册上是如何描述信号与槽的关联时需要使用的QObject::connect().
意思是创建从发送方对象中的信号到接收方对象中的方法的给定类型的连接。返回连接的句柄,可用于稍后断开连接。
参数1 sender :发出信号的对象
参数2 signal: sender 发出的信号
参数3 receiver: 信号接收者
参数4 method :recever对象的槽函数。
常用的连接方式:
connect(obj1 , SIGNAL(signal) , obj2 , SOLT(solt))
信号跟槽的对应关系有点类似与生产者与消费者模式,可以是一个信号多个槽函数,也可以一个槽函数多个信号,也可以多个信号多个槽这样自由搭配。 信号与槽机制的优势:松散耦合。还有个注意点,一个类要支持信号与槽必须从QObject或者QObject子类继承。
- 信号跟槽机制的优缺点,增加了对象之间通信的灵活性,但也会损失一些性能。通过传递一个信号比直接调用来的慢。
代码实战
下面做个简单的功能来熟悉下知识计算正方形的周长:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlineedit.h>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *lab1;
QLabel *lab2;
QLineEdit *ledit;
QPushButton *btn;
private slots: //定义槽函数
void calculate() ; //计算正方形周长
};
#endif // DIALOG_H
#include "dialog.h"
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qgridlayout.h>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
//创建标签提示用户输入边长
lab1 = new QLabel(this);
lab1->setText("请输入边长 :");
lab2 = new QLabel(this); //用来显示周长
//编辑框,输入边长
ledit = new QLineEdit(this);
//命令按钮
btn = new QPushButton(this);
btn->setText("开始计算");
//表格布局
QGridLayout *mlay = new QGridLayout(this);
mlay->addWidget(lab1 , 0 ,0);
mlay->addWidget(ledit, 0 ,1);
mlay->addWidget(lab2, 1, 0);
mlay->addWidget(btn, 1, 1);
connect(btn ,&QPushButton::clicked ,this , &Dialog::calculate );
}
Dialog::~Dialog()
{
}
void Dialog::calculate() {
QString str ;
QString num = ledit->text();
int v = num.toInt();
lab2->setText(str.setNum((v * 4)) );
}
书写的时候注意:信号和槽的格式要对应