【发布时间】:2011-08-16 01:47:20
【问题描述】:
Boost.Signals 允许various strategies 使用槽的返回值来形成信号的返回值。例如。添加它们,从中形成vector,或返回最后一个。
普遍的看法(在 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 不仅不抱怨返回类型为非 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 在这里做什么呢?
Slots can have return values,那么我们现在可以将一个有返回值的槽连接到一个有返回值的信号上吗?毕竟,这可能吗?如果有,有用吗?
编辑:我不是要求解决方法,所以请不要提供任何解决方法。
编辑:它显然在Qt::QueuedConnection 模式下没有用(虽然QPrintPreviewWidget API 也没有,但它仍然存在并且很有用)。但是Qt::DirectConnection 和Qt::BlockingQueuedConnection(或Qt::AutoConnection,当它解析为Qt::DirectConnection 时)呢?
【问题讨论】:
标签: c++ qt return-value signals-slots boost-signals