Boost.Signalsは、スロットの戻り値を使用してシグナルの戻り値を形成するさまざまな戦略を可能にします。たとえば、それらを追加したり、それらから を形成しvector
たり、最後のものを返したりします。
一般的な知恵 (Qt のドキュメント[編集:この質問への回答と同様に]で表現されている) は、Qt シグナルではそのようなことは不可能だということです。
ただし、次のクラス定義でモックを実行すると:
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 は、void 以外の戻り値の型を持つシグナルについて文句を言わないだけでなく、戻り値を渡すことができるように積極的に実装しているようです。
// 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;
}
したがって、ドキュメントによると、これは不可能です。では、moc はここで何をしているのでしょうか。
スロットは戻り値を持つことができるので、戻り値を持つスロットを戻り値を持つシグナルに接続できますか? 結局、それは可能でしょうか?もしそうなら、それは役に立ちますか?
編集:回避策を求めているわけではないので、提供しないでください。
編集:Qt::QueuedConnection
モードでは明らかに役に立ちません(ただし、 QPrintPreviewWidget APIでもありませんが、それでも存在し、有用です)。Qt::DirectConnection
しかし、 and Qt::BlockingQueuedConnection
(またはQt::AutoConnection
に解決される場合は) はどうでしょうかQt::DirectConnection
。