どのように信号とスロットを異なる引数で接続することができますか?

Qtでは、シグナルとスロットには一致する引数型が必要です。

QObject::connect: Incompatible sender/receiver arguments QLabel::linkActivated(QString) --> Button::call(int)

このような組み合わせをどのように実装できますか?

15

3 答え

信号スロットのドキュメントから:

信号の署名は受信の署名と一致していなければなりません   スロット。 (実際、スロットは信号よりも署名が短くてもよい   余分な引数を無視することができるので受信します)。

これは、フォームの信号

signal(int, int, QString)

次のシグネチャを持つスロットにのみ接続できます

slot1(int, int, QString)
slot2(int, int)
slot3(int)
slot4()

koanが提案するように、最良の方法は、QString引数を持つ別のスロットを使用してから、実際に必要なスロットを呼び出すことです。

33
追加された
src オブジェクトのクラスを必要な関数とともに作成することは可能でしょうか?
追加された 著者 chwi,

単純な方法は、あなたが望むスロットを呼び出す中間スロットを持つことです。例えば

connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));

その後

void receiveLink(QString blah)
{
  int response = someFunction(blah);
  mybutton->call(response);
}

文字列をintに解釈するための何らかの方法を定義する必要があります。

17
追加された
私はそれを試してみるよ
追加された 著者 user896036,

スロットパラメータのデフォルト値はとても役に立ちます。これは、異なる署名を持つ信号をスロットに接続することを可能にする(逆もまた@pnezis答え)。

private slots:
  void slot( int x = 10, int y = 20, QString text = QString() );

異なる信号に接続することができます。

signal1(int, int, QString)
signal2(int, int)
signal3(int)
signal4()

また、Qt 4.8では、有用な QSignalMapper クラスを提案しています:

このクラスは、パラメータのない一連の信号を収集し、信号を送信したオブジェクトに対応する整数、文字列、またはウィジェットのパラメータでそれらを再発光します。

しかし、1つのパラメータに対してのみ:

QSignalMapper* mapper = new QSignalMapper(this) ;

connect(action, SIGNAL(triggered()), mapper, SLOT(map())) ;
mapper->setMapping(action, "param value") ;

connect(mapper, SIGNAL(mapped(const QString &)),
  this, SIGNAL(clicked(const QString &)));
3
追加された