7

マップされたソース信号のパラメータを保持する必要があるという問題が発生しました。これまでのところ、パラメータなしで信号をマッピングする例しか見つかりませんでした。たとえば、clicked()シグナルは次のとおりです。

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));

connect(taxFileButton, SIGNAL(clicked()),
     signalMapper, SLOT (map()));

connect(signalMapper, SIGNAL(mapped(QString)),
     this, SLOT(readFile(QString)));

ただし、clicked(bool)シグナルなど、独自のパラメーターを使用してシグナルをマップする必要がある場合、SLOTには2つの引数doStuff(bool、QString)が必要です。

connect(taxFileButton, SIGNAL(clicked(bool)),
     signalMapper, SLOT (map()));

connect(signalMapper, SIGNAL(mapped(QString)),
     this, SLOT(doStuff(bool,QString)));

しかし、それはこのようには機能しませんか?回避策はありますか?

ありがとう!

4

1 に答える 1

7

QSignalMapper信号パラメータを渡す機能は提供していません。

ドキュメントを参照してください:このクラスは、パラメータ
のない信号のセットを収集し、信号を送信したオブジェクトに対応する整数、文字列、またはウィジェットのパラメータを使用してそれらを再発行します。

それを解決する方法があります:

Qt4を使用する場合は、必要なパラメーターをサポートする独自のシグナルマッパーを実装することをお勧めします。
QSignalMapper実装を開始するのに良い例です。

ただし、Qt5を使用すると、まったく使用せずに必要なことを正確に実行できますQSignalMapper。信号をラムダに接続するだけです。

connect(taxFileButton, &TaxFileButton::clicked, [this](bool arg) {
    doStuff(arg, "taxfile.txt");
}  );

クラスtaxFileButtonのインスタンスだと思います。TaxFileButton

C ++ 11ラムダが何らかの理由で適切でない場合は、バインドと値tr1::bindに使用できます。オブジェクトが破棄され ても、このような接続は自動的に切断されないことに注意してください。詳細はこちらです。this"taxfile.txt"
this

于 2012-12-21T17:45:39.983 に答える