2012-12-21 7 views
7

マップされたソース信号のパラメータを保持する必要があるという問題が発生しました。これまでは、パラメータを指定せずに信号をマップする例しか見つかりませんでした。 は例えば、クリックされた()シグナル:QSignalMapperの使用中にソース信号のパラメータを保持する方法は?

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))); 

しかし、私はその後、スロットは二つの引数doStuffを(持っている必要があり、クリックされた(ブール値)信号、たとえば、独自のパラメータを使用して、いくつかの信号をマッピングする必要がありますbool、QString):

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

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

ただし、このように動作しませんか?何か回避策はありますか?

ありがとうございます!

答えて

7

QSignalMapperは、信号パラメータを渡す機能を備えていません。
このクラスはパラメータなし信号のセットを収集し、整数、文字列または信号を送信したオブジェクトに対応するウィジェットのパラメータでそれらを再放出する:

は、マニュアルを参照してください。

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

Qt4ををを使用している場合、私は何が必要なパラメータをサポートし、独自の信号マッパを実装することをお勧めしたいです。
QSignalMapper implementationが良い例です。

しかしQt5が使用されている場合は、を使用すると、使用せずに必要なものを正確に行うことができます。QSignalMapperただ、ラムダに信号を接続します

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

私はtaxFileButtonTaxFileButtonクラスのインスタンスであると仮定します。

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

+0

私自身のマッパークラスを実装する以外に、Qt4でこれを行う簡単な方法はありませんか? – Wang

+2

私は簡単な方法でも幸せになるでしょう:)。今の私のプロジェクトでは、Qt4で説明した方法で同様の作業が行われます。 –

+0

とてもいいです。 QLineEdit :: textEditedイベントのために、さまざまなコントロールを配列データ構造(xとyのインデックス)にマップする必要がありました。それで... connect(lineEdit、&QLineEdit :: textEdited、[this](const QString&str){OnChanged(x、y、str);}); –

関連する問題