一、关联
1.自动关联
在UI界面,右击控件,选择转到槽
2.手动关联
1)自定义信号可以有参数,可以重载,需要声明,不用实现, 返回void,写到signals下
2)自定义槽可以有参数,可以重载,需要声明也要实现,返回void,写到 public slot下或者public 或者全局函数
方式一:connect(信号发出者,SIGNAL(发出的信号),信号接收者,SLOT(槽:相应的处理));
例:connect(QPushButton,SIGNAL(clicked()),this,SLOT(slotOpenFileDlg()));
注:不会检查做错误检查
注:槽只能声明到slots下面
方式二:connect(信号发出者,发出的信号:函数的地址,信号接收者,槽:函数地址);
情况一:没有重载时
例:connect(QPushButton, &QPushButton::clicked , this , &QWidget::close );
新建一个sj类和一个me类,在sj.h中声明信号。由于信号不用实现,所以sj.cpp文件不需要动
#ifndef SJ_H
#define SJ_H
#include <QObject>
class sj : public QObject
{
Q_OBJECT
public:
explicit sj(QObject *parent = nullptr);
signals:
void issj();
};
#endif // SJ_H
在me.h中声明槽函数,并在.cpp中实现
#ifndef ME_H
#define ME_H
#include <QObject>
class me : public QObject
{
Q_OBJECT
public:
explicit me(QObject *parent = nullptr);
signals:
public slots:
void happy();
};
#endif // ME_H
#include "me.h"
#include"QDebug"
me::me(QObject *parent) : QObject(parent)
{
}
void me::happy(){
qDebug()<<"开心";
}
最后在mainwindow的.h声明其对象,在.cpp中连接,并触发sj的信号
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"sj.h"
#include"me.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
sj *s ;
me *m ;
};
#endif // MAINWINDOW_H
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->s = new sj(this);
m = new me(this);
connect(s,&sj::issj,m,&me::happy);
emit s->issj(); //emit用于触发信号
}
情况二:自定义信号和槽,有重载时, 通过指向信号和槽的函数指针来实现(使用emit触发信号)
指针可以指向地址,那指向函数地址的指针就是函数指针;
//sj.h文件
#ifndef SJ_H
#define SJ_H
#include <QObject>
class sj : public QObject
{
Q_OBJECT
public:
explicit sj(QObject *parent = nullptr);
signals:
void issj();
void issj(QString i); //带参数的信号
};
#endif // SJ_H
//sj.cpp文件
#include "sj.h"
sj::sj(QObject *parent) : QObject(parent)
{
}
//me.h文件
#ifndef ME_H
#define ME_H
#include <QObject>
class me : public QObject
{
Q_OBJECT
public:
explicit me(QObject *parent = nullptr);
signals:
public slots:
void happy();
void happy(QString j); //带参数的槽
};
#endif // ME_H
#include "me.h"
#include"QDebug"
me::me(QObject *parent) : QObject(parent)
{
}
void me::happy(){
qDebug()<<"开心";
}
void me::happy(QString j){ //实现带参数的槽
qDebug()<<"开心"<<j;
}
例:注:会对函数类型,个数做检查,推荐使用。
情况三:用lambda表达式写槽函数
connect(s,&sj::issj,m,[=](){ m->happy();});
二、信号其他说明
1.信号连接信号
connect(控件,控件的信号,接收者,槽);
例:connect(login,&QPushButton::clicked,s,sjj);
2.信号可以连接多个槽
connect(login,&QPushButton::clicked,s,sjj);
connect(login,&QAbstractButton::clicked,this,&QWidget::close);
3.多个信号可以连接同一个槽
4.信号的参数可以多于槽的参数,但还是要一一对应
5.断开信号
disconnect(login,&QPushButton::clicked,s,sjj);
6.深入了解信号与槽的连接方式
-Qt::DirectConnection(立即调用)
-Qt::QueuedConnection(异步调用)
-Qt::BlockingQueuedConnection(同步调用)
-Qt::AutoConnection(默认连接)
-Qt::UniqueConnection(单一连接)
bool connect(const QObject* sender, const char* signal, const QObject* receiver, const char* method, Qt::ConnectType type = Qt::AutoConnection);