首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板