8

Qtのドキュメントによると、シグナルの戻り値は不可能です。

シグナルはmocによって自動的に生成されるため、.cppファイルに実装しないでください。リターンタイプを持つことはできません(つまり、voidを使用します)。

関連するSOの質問:

  1. Qtシグナルは値を返すことができますか?
  2. Qt:スロットの戻り値の意味は?

ただし、私の試行(Qt 4.8.1)から、戻り値が機能することがわかります。

  1. 信号/スロットが同じスレッドにある場合、ConnectionTypeは次のようになります。Qt::AutoConnection
  2. 異なるスレッドの信号/スロットで使用する必要があります Qt::BlockingQueuedConnection

だから私のコードでは、私はシグナルを呼び出します

QString dp = emit WscAircrafts::signalAircraftsJsonArray();

信号mocは、を返しますQString

QString _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
return _t0;

これは、それが戻るスロットモックですQString

case 4: { QString _r = _t->slotAircraftJsonArray();
  if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; }  break;

これらはすべて非常に簡単なようですが、なぜこのドキュメントとの矛盾があるのでしょうか。戻り値を使用する場合の問題はどこにありますか?言ったように、私のコードではこれはうまくいくようです。

4

1 に答える 1

5

問題は、接続時にリターンタイプの互換性がチェックされないため、ダブルリターンスロットをフロートリターン信号に接続すると、フロートに割り当てられたスタック(しゃれは意図されていません)スペースがオーバーフローすることです。

于 2013-09-10T14:05:16.593 に答える