2017-07-18 1 views
1

それと述べ:パラメータが最後ではない場合、QT信号スロット接続からパラメータを削除できないことを示す文書はどこにありますか? <a href="http://doc.qt.io/qt-4.8/signalsandslots.html" rel="nofollow noreferrer">QT 4.8 documentation</a>において

シグナルとスロット機構はタイプ安全である:シグナルの署名は、受信スロットの署名が一致しなければなりません。 (実際には、余分な引数を無視することができるため、シグナルは受け取ったシグナルよりも短いシグネチャを持つ可能性があります)。シグネチャは互換性があるため、コンパイラはタイプの不一致を検出するのに役立ちます。

しかしようなコード:

QObject::connect(&source, SIGNAL(MySignal(QByteArray,QString,bool), &sink, SLOT(MySlot(QByteArray,bool)); 

は、 "互換性のない送信者/受信者の引数" エラーが発生します。

なぜこのようなことが起こるのですか。最後からパラメータを削除する必要があることはどこに文書化されていますか?暗黙的な変換では問題が発生する可能性があると私は理解していますが、QTは本質的に上記のように信号/スロットを接続できるメタデータで動作すると考えました。

+0

Qt5接続構文とラムダを使って簡単に行うことができるように、無意味な疑問が少しあります。間違った接続方法を使用しています。 – IlBeldus

答えて

3

[...]余分な引数は無視できます。 [...]

それを読むための明白な方法以外の方法はありません。
は、それが技術的に可能だと一瞬認める(そして、私を信頼し、それを行うための悪夢だろう)と下の文を考えてみます。とても良い、これまでのところ

QObject::connect(
    &source, 
    SIGNAL(MySignal(QString,QString,QString), 
    &sink, 
    SLOT(MySlot(QString,QString) 
); 

。あなたが記述したとおりにQtが機能するなら、QStringは無視されますか?
これらのケースを処理するために一連のルールと例外を導入して、信号スロットツールをすぐに地獄に導くべきでしょうか?


つまり、C++ 11ではラムダ式が言語の一部として使用されています。 Qt5はそれらを歓迎し、あなたが望むものを正確に行うことができる全く新しいセットconnectを定義しました。手で。あなたが本当にそれを必要とし、あなたが何をしているのかを知っているとき。したがって、フレームワークは、イベントが発生したときの要件を推測してはいけません。

+0

ありがとう、非常に最近まで私たちはQT5とC++ 11にいませんでした。私はまだ新しいQT5の呼び出しメソッド(Lambdasなし)を使用して問題を抱えていますが、staticMetaObjectへの「未定義参照」について不平を言っています。古いSIGNALとSLOTベースの接続は同じ場所でうまく動作することに注意してください。 –

+0

@RobertDuffおそらく、あなたは 'QObject'から関与しているすべての型を派生していません。実際のコードを見ずに言うのは簡単ではありません。 – skypjack

+0

クラスはインタフェースですが、QObjectから派生しています(基本クラス宣言で順序付けの問題は一切ありません)。Q_OBJECTマクロを実装しています。シグナルとデストラクタは純粋な仮想ではありませんが、他のすべてのメソッドがあります。 残念ながら、コードをコピーして貼り付けたり、使用しているインターフェイスを編集したりすることはできません。 –

関連する問題