尝试使用 Qt 5 中新的成员函数指针指针语法连接重载信号和槽时,一些用户遇到编译错误。本文解决了根本问题并提供了解决方案。
在提供的示例中,实现了 QSpinBox 的 valueChanged 信号和 QSlider 的 setValue 槽之间的连接,错误源于两个信号的存在相同的名称:valueChanged(int) 和 valueChanged(QString)。
从 Qt 5.7 开始,引入了辅助函数来协助解决信号过载。这些函数允许指定所需的过载。在这种情况下,可以使用:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
对于早期版本的 Qt,需要显式强制转换来指示所需的重载:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
在 Qt 5.7 之前,可以采用替代方法来转换为适当的函数指针:
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(具有 qConstOverload 和 qNonConstOverload 等变体)。
示例用法(来自 Qt 文档):
struct Foo { void overloadedFunction(); void overloadedFunction(int, QString); }; // requires C++14 qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction) // same, with C++11 QOverload<>::of(&Foo:overloadedFunction) QOverload<int, QString>::of(&Foo:overloadedFunction)
在 Qt 5.7 中从那时起,过载信号的文档现在包含有关解决信号过载问题的指南。例如,valueChanged 的 QSpinBox 文档建议使用 qOverload 帮助器,如下所示:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), [=](const QString &text){ /* ... */ });
以上是连接超载信号和槽时如何解决 Qt 5 编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!