Qt:信号的返回值有效,为什么官方文件说不可能/被禁止?

Hor*_*ter 8 qt qt4 qt-signals

Qt文档说,信号的返回值是不可能的:

信号由moc自动生成,不得在.cpp文件中实现.他们永远不会有返回类型(即使用void).

相关的SO问题:

  1. Qt信号可以返回一个值吗?
  2. Qt:槽返回值的含义?

但是,根据我的试验(Qt 4.8.1),我可以告诉返回值确实有效:

  1. 如果signal/slot在同一个线程中,则ConnectionType可能是 Qt::AutoConnection
  2. 我需要使用不同线程中的信号/插槽 Qt::BlockingQueuedConnection

所以在我的代码中我通过调用信号

QString dp = emit WscAircrafts::signalAircraftsJsonArray();
Run Code Online (Sandbox Code Playgroud)

并且信号moc返回a QString,

QString _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
return _t0;
Run Code Online (Sandbox Code Playgroud)

这里是它传回的插槽moc QString

case 4: { QString _r = _t->slotAircraftJsonArray();
  if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; }  break;
Run Code Online (Sandbox Code Playgroud)

所有这一切似乎都很直接,为什么这与文档的矛盾呢?使用返回值的问题在哪里?如上所述,在我的代码中,这似乎有效.

Mar*_*utz 5

问题是在连接时没有检查返回类型的兼容性,因此将双返回槽连接到浮点返回信号,比如说,将溢出堆栈(没有双关语意图)空间分配给浮点数.