在Qt 5 中連接重載的信號和槽
當嘗試使用指向成員的指針連接Qt 5 中的重載信號和槽時函數語法,開發人員可能會遇到編譯錯誤。要解決這個問題,必須了解問題並應用適當的解決方案。
訊號和槽過載的問題
訊號和槽過載,例如QSpinBox: :valueChanged(int) 和QSpinBox::valueChanged(QString) 連接它們時可能會導致混亂。當嘗試連接到訊號而不明確指定要使用哪個重載時,就會出現此問題。
Qt 5.7 及更高版本的解決方案
從 Qt 5.7 開始,Qt 提供了幫助程式功能來選擇所需的訊號過載。若要指定重載訊號,請使用 qOverload 函數,如下所示:
connect(spinBox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Qt 5.6 及更早版本的解
對於 Qt 5.7先前的版本,明確強制轉換使用訊號傳送到正確的類型static_cast:
connect(spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
醜陋的解決方法
雖然有效,但static_cast 方法遠非優雅。考慮使用以下 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(&QSpinBox::valueChanged), ...)
Qt 5.7 輔助函數
Qt 5.7 引入了輔助函數來簡化流程。主要幫助器是 qOverload,還有 qConstOverload 和 qNonConstOverload 等附加選項。
文件說明
在 Qt 5.7 及更高版本中,重載訊號的文件明確提供了以下範例如何使用輔助函數連接到每個重載。具體指導請參閱文件。
以上是如何在 Qt 5 中連接重載的訊號和插槽?的詳細內容。更多資訊請關注PHP中文網其他相關文章!