ホームページ >バックエンド開発 >C++ >Qt 5 でオーバーロードされた信号とスロットを接続する方法は?

Qt 5 でオーバーロードされた信号とスロットを接続する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-12 15:16:11541ブラウズ

How to Connect Overloaded Signals and Slots in Qt 5?

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 では、プロセスを合理化するためにヘルパー関数が導入されました。主なヘルパーは qConstOverload や qNonConstOverload などの追加オプションを備えた qOverload です。

ドキュメントに関するメモ

Qt 5.7 以降では、オーバーロードされたシグナルのドキュメントで明示的に例が提供されています。ヘルパー関数を使用して各オーバーロードに接続する方法。具体的なガイダンスについては、ドキュメントを参照してください。

以上がQt 5 でオーバーロードされた信号とスロットを接続する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。