QT:信号返回值起作用了,为什么官方文档说不可能/禁止? [英] Qt: Return value of signal works, why is the official doc saying it is impossible / forbidden?

查看:21
本文介绍了QT:信号返回值起作用了,为什么官方文档说不可能/禁止?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Qt documentation表示信号返回值不可能:

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

相关SO问题:

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

然而,从我的试验(Qt 4.8.1)可以看出返回值确实起作用:

  1. 如果信号/槽在同一线程中,则ConnectionType可能为Qt::AutoConnection
  2. 对于不同线程中的信号/槽,我需要使用Qt::BlockingQueuedConnection

所以在我的代码中,我通过

调用信号
QString dp = emit WscAircrafts::signalAircraftsJsonArray();

并且信号moc返回一个QString

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

这是插槽moc,它在其中回传QString

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

所有这些似乎都很简单,那么为什么要与文档矛盾呢?使用返回值会有什么问题?如前所述,在我的代码中,这似乎是可行的。

推荐答案

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

这篇关于QT:信号返回值起作用了,为什么官方文档说不可能/禁止?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆