自定义信号需要遵循的规则
- 信号是类的成员函数,并且返回类型必须是 void 类型
- 信号函数只需要声明, 不需要定义(没有函数体实现)
- 参数可以随意指定, 信号也支持重载
- 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
- 在程序中发送自定义信号: 发送信号的本质就是调用信号函数
创建信号:
cpp
signals:
void mysignals();
信号发送
cpp
emit mysignals(); //发送信号
创建槽函数
cpp
private slots:
void addvalue();
信号绑定
完成连接connect的过程包括以下内容:
- 信号的发送(信号发出者)
- 信号发送的具体内容(发出的信号)
- 信号的接受(信号接收者)
- 信号的处理(信号槽函数)
信号槽的优点: 松散耦合
信号的发送方和接受方本身没有关联(发送端的信号不一定触发接收端处理,接收端也不一定要接收信号后才完成操作),只是通过连接connect将两端耦合在一起。
cpp
connect(this,SIGNAL(mysignals()),this,SLOT(addvalue()));
以检测一个变量值改变的信号为例子:
mainwindows.h
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void valueadd();
private:
Ui::MainWindow *ui;
void add();
int value=0;
private slots:
void addvalue();
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
mainwindows.cpp
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this,SIGNAL(valueadd()),this,SLOT(addvalue()));
//add();
}
MainWindow::~MainWindow()
{
delete ui;
}
//void MainWindow::add()
//{
// value++;
// emit valueadd();
//}
void MainWindow::addvalue()
{
qDebug()<<value;
}
void MainWindow::on_pushButton_clicked()
{
value++;
emit valueadd();
}
实现的功能是点击按钮后value变量的值增加,然后发送valueadd信号,输出value的值