ここでの問題があるということです2:その名前の信号をQSpinBox::valueChanged(int)
とQSpinBox::valueChanged(QString)
。Qt 5.7以降、目的のオーバーロードを選択するためのヘルパー関数が提供されているため、次のように記述できます。
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Qt 5.6以前の場合、正しいタイプにキャストすることで、選択するQtをQtに指示する必要があります。
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
私は知っています、それは醜いです。しかし、これを回避する方法はありません。今日のレッスンは次のとおりです。信号とスロットに過負荷をかけないでください!
補遺:キャストについて本当に迷惑なのは、
- クラス名を2回繰り返す
- 通常の場合
void
(シグナルの場合)でも、戻り値を指定する必要があります。
だから私は時々この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), ...)
個人的にはあまり役に立たない。PMFを取得する操作をオートコンプリートするときにCreator(またはIDE)が自動的に正しいキャストを挿入すると、この問題は自然に解消されると思います。しかし、その間...
注:PMFベースの接続構文にはC ++ 11は必要ありません!
補遺2:Qt 5.7では、これを軽減するためのヘルパー関数が追加され、上記の私の回避策をモデルにしています。主なヘルパーはqOverload
(とも持っqConstOverload
ていますqNonConstOverload
)です。
使用例(ドキュメントから):
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)
補遺3:オーバーロードされた信号のドキュメントを見ると、オーバーロードの問題の解決策がドキュメント自体に明確に記載されています。たとえば、https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1は
注:シグナルvalueChangedはこのクラスでオーバーロードされます。関数ポインタ構文を使用してこの信号に接続するために、Qtは次の例に示すように、関数ポインタを取得するための便利なヘルパーを提供します。
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });