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>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
對於Qt 5.6 及更早版本:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &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(&QSpinBox::valueChanged), ...)
替代方案
C 11 解決方法:qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction)Qt 5.7 助手函數:Qt 5.7 助手函數: >查閱Qt文件以取得有關處理重載訊號和槽的最新資訊。
以上是如何解決 Qt 5 中訊號槽連接過載的問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!