首页 > 后端开发 > C++ > 连接超载信号和槽时如何解决 Qt 5 编译错误?

连接超载信号和槽时如何解决 Qt 5 编译错误?

Susan Sarandon
发布: 2024-12-09 18:52:15
原创
530 人浏览过

How to Resolve Qt 5 Compilation Errors When Connecting Overloaded Signals and Slots?

解决 Qt 5 中重载信号和槽的连接问题

尝试使用 Qt 5 中新的成员函数指针指针语法连接重载信号和槽时,一些用户遇到编译错误。本文解决了根本问题并提供了解决方案。

在提供的示例中,实现了 QSpinBox 的 valueChanged 信号和 QSlider 的 setValue 槽之间的连接,错误源于两个信号的存在相同的名称:valueChanged(int) 和 valueChanged(QString)。

解决重载问题问题

从 Qt 5.7 开始,引入了辅助函数来协助解决信号过载。这些函数允许指定所需的过载。在这种情况下,可以使用:

connect(spinbox, qOverload<int>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
登录后复制

对于早期版本的 Qt,需要显式强制转换来指示所需的重载:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
登录后复制

早期 Qt 版本的替代方案

在 Qt 5.7 之前,可以采用替代方法来转换为适当的函数指针:

  • 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(&amp;QSpinBox::valueChanged), ...)
登录后复制

Qt 5.7 改进

中Qt 5.7 添加了辅助函数来简化选择重载信号的过程。主要帮助器是 qOverload(具有 qConstOverload 和 qNonConstOverload 等变体)。

示例用法(来自 Qt 文档):

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, QString);
};

// requires C++14
qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

// same, with C++11
QOverload<>::of(&amp;Foo:overloadedFunction)
QOverload<int, QString>::of(&amp;Foo:overloadedFunction)
登录后复制

信号重载文档

在 Qt 5.7 中从那时起,过载信号的文档现在包含有关解决信号过载问题的指南。例如,valueChanged 的​​ QSpinBox 文档建议使用 qOverload 帮助器,如下所示:

connect(spinBox, QOverload<const QString &amp;>::of(&amp;QSpinBox::valueChanged),
[=](const QString &amp;text){ /* ... */ });
登录后复制

以上是连接超载信号和槽时如何解决 Qt 5 编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板