Qt: Return value of signal works, why is the official doc saying it is impossible / forbidden?

大兔子大兔子 提交于 2019-12-01 15:02:23

问题


Qt documentation says, return values of signals are not possible:

Signals are automatically generated by the moc and must not be implemented in the .cpp file. They can never have return types (i.e. use void).

Related SO questions:

  1. Can Qt signals return a value?
  2. Qt: meaning of slot return value?

However, from my trials (Qt 4.8.1) I can tell return values do work:

  1. If signal / slot are in the same thread, ConnectionType may be Qt::AutoConnection
  2. With signal / slot in different threads I need to use Qt::BlockingQueuedConnection

So in my code I call a signal by

QString dp = emit WscAircrafts::signalAircraftsJsonArray();

and the signal moc returns a QString,

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

This here is the slot moc where it passes back the QString

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

All of this seems to be pretty much straight forward, so why this contradiction with the documentation? Where would be the problem using the return value? As said, in my code this seems to work.


回答1:


The problem is that the return types are are not checked for compatibility at connect-time, thus connecting a double-returning slot to a float-returning signal, say, will overflow the stack (no pun intended) space allocated to the float.



来源:https://stackoverflow.com/questions/11890644/qt-return-value-of-signal-works-why-is-the-official-doc-saying-it-is-impossibl

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!