Boost.Signals 允许使用插槽的返回值来形成信号的返回值的各种策略。例如,将它们相加、将它们组合成一个 vector
,或者返回最后一个。
通常的智慧(在 Qt 文档中表达)是,在 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;
}
所以:根据文档,这个事情是不可能的。那么 mok 在这里做什么?
插槽可以有返回值,所以现在我们是否可以将具有返回值的插槽连接到具有返回值的信号上?毕竟,这可能是可能的吗?如果是这样,那么它有用吗?
我不是在寻求变通方法。
很明显,在 Qt::QueuedConnection
模式下是没有用的(尽管 QPrintPreviewWidget API 也是如此,但它仍然存在且有用)。但是对于 Qt::DirectConnection
和 Qt::BlockingQueuedConnection
(或者当它解析为 Qt::DirectConnection
时的 Qt::AutoConnection
),情况如何?