当Qt类中存在重载信号时,使用connect函数需要特别注意,因为编译器无法自动确定要连接的是哪个重载版本。以下是几种处理重载信号连接的方法:
对于QComboBox的currentIndexChanged信号有两个重载版本:
// void currentIndexChanged(int)
// void currentIndexChanged(const QString &)
1、使用静态转换(QOverload或qOverload) - C++14及以上推荐
这是最现代和类型安全的方法:
// 连接int版本的信号
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &MyClass::onIndexChanged);
// 或者使用qOverload (Qt 5.7+)
connect(comboBox, qOverload<int>(&QComboBox::currentIndexChanged),this, &MyClass::onIndexChanged);
2、使用静态转换(static_cast) - 传统方法---函数指针
//连接int版本的
connect(comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),[=](int index){ /* ... */ });
//连接const QString &版本的
connect(comboBox, static_cast<void(QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),[=](const QString &text){ /* ... */ });
3、使用QSignalMapper (适用于较老版本的Qt)
这种方法现在不推荐使用,但在一些旧代码中可能会看到:
QSignalMapper *mapper = new QSignalMapper(this);
connect(comboBox, SIGNAL(currentIndexChanged(int)), mapper, SLOT(map()));
mapper->setMapping(comboBox, 0);
connect(mapper, SIGNAL(mapped(int)), this, SLOT(handleIndexChanged(int)));
4、 使用lambda表达式
如果槽函数逻辑简单,可以直接用lambda:
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
[this](int index) {
// 处理index变化
});
5、 使用旧式SIGNAL/SLOT语法(不推荐)
虽然可以工作,但缺乏类型安全,不推荐在新代码中使用:
connect(comboBox, SIGNAL(currentIndexChanged(int)),this, SLOT(onIndexChanged(int)));