Boost.Signalsは、スロットの戻り値を使用して信号の戻り値を形成するvarious strategiesを許可します。例えば。それらを追加するか、vector
を作成するか、最後のものを返します。Qt信号が値を返すことはできますか?
(Qtのドキュメントで表現[EDIT:だけでなく、この質問にいくつかの答え])共通の知恵はそのような事はQtの信号で可能ではないということです。しかし
、私は次のクラス定義上MOCを実行します。
class Object : public QObject {
Q_OBJECT
public:
explicit Object(QObject * parent=0)
: QObject(parent) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
だけでなく、非空の戻り値の型を持つ信号文句MOCはありません、積極的にそれを実装するようですのような方法は、戻り値を通過させる:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
ので:ドキュメントによると、このことはできません。では、ここでモックは何をしていますか?
Slots can have return valuesここで、戻り値を持つスロットに戻り値のある信号を接続することはできますか?結局それは可能だろうか?もしそうなら、それは役に立ちますか?
編集:私は回避策を求めていないので、何も提供しないでください。
EDIT:それは明らかに(ただし、QPrintPreviewWidget APIではありません、そしてまだそれが存在すると便利ですどちらも)Qt::QueuedConnection
モードでは有用ではありません。しかし、Qt::DirectConnection
とQt::BlockingQueuedConnection
(またはQt::AutoConnection
、それがQt::DirectConnection
に解決されるとき)についてはどうでしょうか。
実際にお試しいただきありがとうございます:)私はあなたのコードをより簡単で短く編集しました。しかし、問題は依然として立っている:もしそれが動作する( "最後に呼ばれた"セマンティクスで)、なぜドキュメントはそれがないと言っているのだろうか? –
良い質問です。私はドキュメントは、それが部分的な戻り値であるため動作しないと言います。シグナル排出量*の本当の戻り値は、何らかの種類のアグリゲーターに基づくすべての結果の集計でなければなりません(ブーストのように)。しかし、それがなければ、それは部分的で未定義の結果です(特に、同時シグナル呼び出しの場合)。おそらくコンパイラの違いもありますか? – jsherer
Qt 5.0でまだ動作していないことが保証されていないことを意味します。 – Torp