QT 自定义信号
自定义信号需要遵循的规则
- 信号是类的成员函数,并且返回类型必须是 void 类型
- 信号函数只需要声明, 不需要定义(没有函数体实现)
- 参数可以随意指定, 信号也支持重载
- 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
- 在程序中发送自定义信号: 发送信号的本质就是调用信号函数
创建信号:
signals:void mysignals();
信号发送
emit mysignals(); //发送信号
创建槽函数
private slots:void addvalue();
信号绑定
完成连接connect的过程包括以下内容:
- 信号的发送(信号发出者)
- 信号发送的具体内容(发出的信号)
- 信号的接受(信号接收者)
- 信号的处理(信号槽函数)
信号槽的优点: 松散耦合
信号的发送方和接受方本身没有关联(发送端的信号不一定触发接收端处理,接收端也不一定要接收信号后才完成操作),只是通过连接connect将两端耦合在一起。
connect(this,SIGNAL(mysignals()),this,SLOT(addvalue()));
以检测一个变量值改变的信号为例子:
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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
#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的值