首页 >后端开发 >C++ >如何解决 Qt 5 中信号槽连接过载的问题?

如何解决 Qt 5 中信号槽连接过载的问题?

DDD
DDD原创
2024-12-15 16:19:15157浏览

How to Resolve Overloaded Signal-Slot Connections in Qt 5?

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

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>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);

对于 Qt 5.6 及更早版本:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;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(&amp;QSpinBox::valueChanged), ...)

Qt 5.7 助手函数:

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

查阅 Qt 文档以获取有关处理重载信号和槽的最新信息。

以上是如何解决 Qt 5 中信号槽连接过载的问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn