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();
};
Run Code Online (Sandbox Code Playgroud)
不仅没有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;
}
Run Code Online (Sandbox Code Playgroud)
所以:根据文档,这件事是不可能的.那么moc在这做什么?
插槽可以有返回值,那么我们可以将带有返回值的插槽连接到具有返回值的信号吗?毕竟,这可能吗?如果是这样,它有用吗?
编辑:我不是要求解决方法,所以请不要提供任何解决方法.
编辑:它显然在Qt::QueuedConnection模式中没用(QPrintPreviewWidget …
根据文档,插槽的返回值并不意味着什么.
然而在生成的moc代码中,我看到如果一个槽返回一个值,则该值用于某些东西.知道它做了什么?
这是我正在谈论的一个例子.这是从moc生成的代码中获取的.'message'是一个不返回任何内容的插槽,'selectPart'被声明为返回int.
case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break;
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])));
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
Run Code Online (Sandbox Code Playgroud)