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);

陕ICP备2025078817号-1 陕公网安备61011202001108号