嘗試使用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中文網其他相關文章!