我在将QButtonGroup的信号连接到函子时遇到问题。
functionGroup = new QButtonGroup();
functionGroup->addButton( ui->pushButtonSetupExperiment, 0);
functionGroup->addButton( ui->pushButtonConfigure, 1);
functionGroup->addButton( ui->pushButtonModify, 2);
functionGroup->addButton( ui->pushButtonSearch, 3);
functionGroup->addButton( ui->pushButtonLogout, 4);
/* This works:
connect( ui->pushButtonSetupExperiment, &QPushButton::clicked, [=]() {
emit finished(0);
});
*/
// This fails:
connect( functionGroup, &QButtonGroup::buttonClicked, [=](int id) {
emit finished(id);
});
出现以下编译器错误:
error: C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const' : Cannot convert argument 2 from 'overloaded-function' to 'const char *'...
不知道出了什么问题。当然,我可以使用旧语法来完成任务,但我需要了解这里的错误。谢谢你帮我!
Qt版本:5.5.1
编译器:msvc2012
问题是QButtonGroup::buttonClicked
有两个重载,它无法消除您所说的哪个重载的歧义,因此它会生成编译错误。为了避免这种情况,您需要使用static_cast
来指示要使用buttonClicked
的哪个变体。不幸的是,语法有点笨拙:
connect(functionGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), ...);
有关更多信息,请参阅@Devopia链接的"插槽连接之间的差异"文档页面。根据您的个人意见,您可能希望使用旧的基于字符串的连接语法(即,值简洁性和可读性高于类型安全性)。或者,您可以使用宏或using
类型的别名来尝试简化事情。