我在将 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);
});
出现以下编译器错误:
错误:C2664:“QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const”:无法从“重载函数”转换参数 2到 'const char *'...
无法弄清楚哪里出了问题。当然我可以使用旧语法来完成任务,但我需要了解这里有什么问题。谢谢你帮助我!
Qt版本:5.5.1
编译器:msvc2012
最佳答案
问题是 QButtonGroup::buttonClicked
有两个重载,它不能消除你指的是哪一个的歧义,所以它会产生编译错误。要解决此问题,您需要使用 static_cast
来指示要使用的 buttonClicked
变体。不幸的是,语法有点笨拙:
connect(functionGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), ...);
有关详细信息,请参阅 Differences between Slot Connections由@Devopia 链接的文档页面。根据您的个人意见,您可能希望为此使用旧的基于字符串的连接语法(即重视简洁性和可读性而不是类型安全)。或者您可以使用宏或使用
类型别名来尝试简化事情。
关于c++ - 无法将 QButtonGroup buttonClicked 连接到仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603778/