无法将QButtonGroup buttonClicked连接到仿函数

时间:2016-01-05 03:37:53

标签: c++ qt qt5

我无法将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

1 个答案:

答案 0 :(得分:3)

问题是QButtonGroup::buttonClicked有两个重载,它无法消除你的意思,因此它会产生编译错误。要解决此问题,您需要使用static_cast来指明您要使用的buttonClicked变体。不幸的是,语法有点笨拙:

connect(functionGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), ...);

有关详细信息,请参阅由@Devopia链接的Differences between Slot Connections文档页面。根据您的个人意见,您可能希望使用旧的基于字符串的连接语法(即,值简洁性和可读性而不是类型安全性)。或者您可以使用宏或using类型别名来尝试简化操作。