c++ - 无法将 QButtonGroup buttonClicked 连接到仿函数

标签 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);
});

出现以下编译器错误:

错误: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/

相关文章:

c++ - 将 raw operator new、placement new 和 standard delete 结合起来是否合法?

c++ - 如何从类访问结构?

qt - 在 Qt GUI 主窗口上嵌入 PCL 查看器

c++ - 在qt窗口的一小部分查看图像

c++ - QObject双删

c++ - Windows下的_stat()到底是怎么工作的

c++ - 为什么修改另一个变量引用的字段会导致意外行为?

c++ - cbegin()/cend() 与 constBegin()/constEnd()

c++ - QOpenGLFunctions 缺少重要的 OpenGL 函数

python - 当没有必要时,为什么要在 PyQt 中导入 QtGui 和 QtCore?