Qt 5 引入了一种使用指向成员函数的指针的新信号槽语法,旨在提高可读性和可扩展性。然而,它在连接到过载信号时遇到了挑战。
尝试使用新语法更新代码,从:
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int));
到:
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
由于未解析的重载函数而发生编译错误问题。
该问题源于存在两个名为 QSpinBox::valueChanged(int) 和 QSpinBox::valueChanged(QString) 的重载信号。 Qt 提供了辅助函数来解决此重载问题。
对于 Qt 5.7 及更高版本:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
对于 Qt 5.6 及更早版本:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
这种显式转换虽然很麻烦,但对于指定所需的信号。强烈建议避免信号和槽过载。
C 11 解决方法:
template<typename... Args> struct SELECT { template<typename C, typename R> static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { return pmf; } };
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Qt 5.7 助手函数:
qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction)
查阅 Qt 文档以获取有关处理重载信号和槽的最新信息。
以上是如何解决 Qt 5 中信号槽连接过载的问题?的详细内容。更多信息请关注PHP中文网其他相关文章!