ホームページ > バックエンド開発 > C++ > オーバーロードされた信号とスロットを接続する際の Qt 5 コンパイル エラーを解決するにはどうすればよいですか?

オーバーロードされた信号とスロットを接続する際の Qt 5 コンパイル エラーを解決するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-09 18:52:15
オリジナル
530 人が閲覧しました

How to Resolve Qt 5 Compilation Errors When Connecting Overloaded Signals and Slots?

Qt 5 のオーバーロードされた信号とスロットによる接続の問題を解決する

Qt 5 の新しいポインターからメンバーへの関数構文を使用してオーバーロードされた信号とスロットを接続しようとする場合、一部のユーザーはコンパイル エラーに遭遇します。この記事では、根本的な問題に対処し、それを解決するための解決策を提供します。

QSpinBox の valueChanged 信号と QSlider の setValue スロットの間の接続を実装するこの例では、エラーは、同じ名前: valueChanged(int) と valueChanged(QString).

オーバーロードのアドレス指定問題

Qt 5.7 以降、信号の過負荷の解決を支援するヘルパー関数が導入されました。これらの関数を使用すると、必要なオーバーロードを指定できます。この場合、以下を使用できます:

connect(spinbox, qOverload<int>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
ログイン後にコピー

Qt の以前のバージョンの場合、目的のオーバーロードを示すために明示的なキャストが必要です:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
ログイン後にコピー

以前の Qt バージョンの代替

Qt 5.7 より前では、代替アプローチを使用して適切な関数にキャストできましたポインタ:

  • 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(&amp;QSpinBox::valueChanged), ...)
ログイン後にコピー

Qt 5.7改善点

Qt 5.7 では、オーバーロードされた信号を選択するプロセスを合理化するヘルパー関数が追加されました。メインのヘルパーは qOverload (qConstOverload や qNonConstOverload などのバリエーションあり) です。

使用例 (Qt ドキュメントより):

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, QString);
};

// requires C++14
qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

// same, with C++11
QOverload<>::of(&amp;Foo:overloadedFunction)
QOverload<int, QString>::of(&amp;Foo:overloadedFunction)
ログイン後にコピー

Signal Overload Documentation

Qt 5.7以降、過負荷信号のドキュメントには、信号の過負荷の問題を解決するためのガイダンスが含まれるようになりました。たとえば、valueChanged の QSpinBox ドキュメントでは、以下に示すように qOverload ヘルパーの使用を推奨しています。

connect(spinBox, QOverload<const QString &amp;>::of(&amp;QSpinBox::valueChanged),
[=](const QString &amp;text){ /* ... */ });
ログイン後にコピー

以上がオーバーロードされた信号とスロットを接続する際の Qt 5 コンパイル エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート