Qt 5 の新しいポインターからメンバーへの関数構文を使用してオーバーロードされた信号とスロットを接続しようとする場合、一部のユーザーはコンパイル エラーに遭遇します。この記事では、根本的な問題に対処し、それを解決するための解決策を提供します。
QSpinBox の valueChanged 信号と QSlider の setValue スロットの間の接続を実装するこの例では、エラーは、同じ名前: valueChanged(int) と valueChanged(QString).
Qt 5.7 以降、信号の過負荷の解決を支援するヘルパー関数が導入されました。これらの関数を使用すると、必要なオーバーロードを指定できます。この場合、以下を使用できます:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Qt の以前のバージョンの場合、目的のオーバーロードを示すために明示的なキャストが必要です:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Qt 5.7 より前では、代替アプローチを使用して適切な関数にキャストできましたポインタ:
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 では、オーバーロードされた信号を選択するプロセスを合理化するヘルパー関数が追加されました。メインのヘルパーは qOverload (qConstOverload や qNonConstOverload などのバリエーションあり) です。
使用例 (Qt ドキュメントより):
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)
Qt 5.7以降、過負荷信号のドキュメントには、信号の過負荷の問題を解決するためのガイダンスが含まれるようになりました。たとえば、valueChanged の QSpinBox ドキュメントでは、以下に示すように qOverload ヘルパーの使用を推奨しています。
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), [=](const QString &text){ /* ... */ });
以上がオーバーロードされた信号とスロットを接続する際の Qt 5 コンパイル エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。