8

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

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

相关的SO问题:

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

但是,从我的试验(Qt 4.8.1)我可以看出返回值确实有效:

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

所以在我的代码中,我调用了一个信号

QString dp = emit WscAircrafts::signalAircraftsJsonArray();

并且信号 moc 返回 a QString

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

这是它传回的插槽 mocQString

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

所有这些似乎都非常简单,那么为什么会与文档相矛盾呢?使用返回值的问题在哪里?如前所述,在我的代码中这似乎有效。

4

1 回答 1

5

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

于 2013-09-10T14:05:16.593 回答