Qt:连接重载信号的几种方式
以QComboBox的信号currentIndexChanged为例,它有以下两种形式:
void currentIndexChanged(const QString &text)
void currentIndexChanged(int index)
假设我们要连接它的int型版本,对应的槽函数为void onIndexChanged(int index)
使用SIGNAL/SLOT宏连接
使用SIGNAL/SLOT宏连接时,槽函数的声明需要放置在Q_SLOTS下(否则槽函数不会被触发),如:
public Q_SLOTS:
void onIndexChanged(int index);
// 等价的实现
public slots:
void onIndexChanged(int index);
slots只是Q_SLOTS的一个#define
#define slots Q_SLOTS
#define signals Q_SIGNALS
连接方法是:
connect(ui.comboBox,
SIGNAL(currentIndexChanged(int)),
this,
SLOT(onIndexChanged(int)));
使用 static_cast 类型转换连接
使用c++类型转换连接时,不强制槽函数声明在Q_SLOTS下,此时连接实现如下:
connect(ui.comboBox,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&MainWindow::onIndexChanged);
使用QOverload辅助类连接
如果不喜欢C++类型转换连接方式(代码肉眼可见够长),那么可以使用Qt提供的辅助类QOverload进行连接,此时也不强制要求槽函数声明在Q_SLOTS下,连接方法是:
connect(ui.comboBox,
QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&MainWindow::onIndexChanged);
还有一个qOverload可用于槽函数连接,书写上更流畅。
connect(ui.comboBox,
qOverload<int>(&QComboBox::currentIndexChanged),
this,
&MainWindow::onIndexChanged);