网上查找资料,并实际验证可行性,列出以下列常用用法:
//! [1]基于字符串匹配,Qt4.0
// connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(slotShowCurrTime(bool)));
//! [2]基于方法地址匹配,Qt5.0
// connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::slotShowCurrTime);
//! [3]基于方法地址匹配,c++11,static_cast
// connect(ui->pushButton, static_cast<void(QPushButton::*)(bool)>(&QPushButton::clicked),
// this, &MainWindow::slotShowCurrTime);
//! [4]基于方法地址匹配,函数指针
// void (QPushButton::*ff)(bool) = &QPushButton::clicked;
// connect(ui->pushButton, ff, this, &MainWindow::slotShowCurrTime);
//! [5]基于方法地址匹配,c++11,QOverload
// connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked), this, &MainWindow::slotShowCurrTime);
//! [6]基于方法地址匹配,c++14,qOverload,还不太好使,不知道缺啥
// connect(ui->pushButton, qOverload<bool>(&QPushButton::clicked), this, &MainWindow::slotShowCurrTime)
//! [7]基于方法地址匹配,lamda表达式
// connect(ui->pushButton, &QPushButton::clicked, [=]()
// {
// slotShowCurrTime(true);
// });
// connect(ui->pushButton, &QPushButton::clicked, [=](bool cs)
// {
// slotShowCurrTime(cs);
// });
// connect(ui->pushButton, static_cast<void(QPushButton::*)(bool)>(&QPushButton::clicked), [=](bool cs){
// slotShowCurrTime(cs);
// });
// connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked), [=](bool cs){
// slotShowCurrTime(cs);
// });
下面一种是传递自定义数据类型
.h文件必要代码
#include <QVariant>
//自定义结构体用作参数类型
struct myType_st{
int aa;
};
Q_DECLARE_METATYPE(myType_st)
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
//...
signals:
void signalPassMyType(QVariant variant);
public slots:
void slotPassMyType(QVariant variant);
//...
}
.cpp文件必要代码
void MainWindow::slotPassMyType(QVariant variant)
{
myType_st myType = variant.value<myType_st>();
qDebug() << myType.aa;
}
connect(this, &MainWindow::signalPassMyType, this, &MainWindow::slotPassMyType);
myType_st st;
st.aa = 45;
QVariant variant;
variant.setValue(st);
emit signalPassMyType(variant);
最后,补充说明:
信号-槽可以一对多、多对一、信号A可以连接到信号B上。
一对多时响应顺序按照connect顺序执行,
emit signal后依次执行完slot才继续执行emit后面的语句。
槽函数相当于C语言的回调函数,槽可以忽略信号中多余的参数。
在使用信号、槽的类中,必须在类的定义中加入宏Q_OBJECT,
connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类
转用+http://c.biancheng.net/view/1823.html
转用+https://blog.csdn.net/fuhanghang/article/details/123521690