我在Qt 5中无法掌握新的信号/槽语法(使用指向成员函数的指针),如New Signal Slot Syntax中所述 . 我尝试改变这个:
QObject::connect(spinBox, SIGNAL(valueChanged(int)),
slider, SLOT(setValue(int));
对此:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
但是当我尝试编译它时出错:
错误:没有用于调用QObject :: connect的匹配函数(QSpinBox *&,<unresolved overloaded function type>,QSlider *&,void(QAbstractSlider :: *)(int))
我在Linux上尝试过使用clang和gcc,都使用 -std=c++11
.
我做错了什么,我该如何解决?
4 回答
这里的问题是 two 信号具有该名称:
QSpinBox::valueChanged(int)
和QSpinBox::valueChanged(QString)
. 从Qt 5.7开始,提供了辅助函数来选择所需的过载,因此您可以编写对于Qt 5.6及更早版本,您需要通过将Qt转换为正确的类型来告诉Qt您要选择哪一个:
我知道,这是 ugly . 但是_____99895的教训是:不要让信号和插槽过载!
Addendum :对演员来说真正令人讨厌的是
一次重复两次 class 名称
必须指定返回值,即使它通常是
void
(对于信号) .所以我发现自己有时使用这个C 11片段:
用法:
我个人认为它不是很有用 . 我希望当Creator(或你的IDE)在自动完成获取PMF的操作时自动插入正确的强制转换时,这个问题会自行消失 . 但同时......
注意:基于PMF的连接语法 does not require C++11 !
Addendum 2 :在Qt 5.7中添加了辅助函数来缓解这种情况,模仿我上面的解决方法 . 主助手是qOverload(你也有qConstOverload和qNonConstOverload) .
用法示例(来自文档):
错误消息是:
其中重要的部分是提到“ unresolved overloaded function type ” . 编译器不知道您的意思是
QSpinBox::valueChanged(int)
还是QSpinBox::valueChanged(QString)
.有几种方法可以解决过载:
为connect()提供合适的模板参数
这会强制
connect()
将&QSpinBox::valueChanged
解析为带有int
的重载 .如果slot参数有未解决的重载,那么您需要将第二个模板参数提供给
connect()
. 不幸的是,'s no syntax to ask for the first to be inferred, so you'll需要供应两者 . 那是第二种方法可以帮助:使用正确类型的临时变量
对
signal
的赋值将选择所需的重载,现在可以将其成功替换到模板中 . 这与'slot'参数同样有效,我发现在这种情况下它不那么麻烦 .使用转化
我们可以在这里避免
static_cast
,因为它保护了它 . 我使用类似的东西:这允许我们写
实际上,你可以用lambda包装你的插槽,这个:
看起来会更好 . :\
上面的解决方案有效,但是我用一种稍微不同的方式解决了这个问题,使用了一个宏,所以以下是以下情况:
在您的代码中添加它 .
然后,你的例子:
变为: