首頁 >後端開發 >C++ >如何解決 Qt 5 中訊號槽連接過載的問題?

如何解決 Qt 5 中訊號槽連接過載的問題?

DDD
DDD原創
2024-12-15 16:19:15156瀏覽

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);

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), ...)

替代方案

C 11 解決方法:
qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

Qt 5.7 助手函數:Qt 5.7 助手函數: >查閱Qt文件以取得有關處理重載訊號和槽的最新資訊。

以上是如何解決 Qt 5 中訊號槽連接過載的問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn