Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt:信号工作的返回值,为什么官方文件说不可能/禁止?_Qt_Qt4_Qt Signals - Fatal编程技术网

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

Qt:信号工作的返回值,为什么官方文件说不可能/禁止?,qt,qt4,qt-signals,Qt,Qt4,Qt Signals,表示,不可能返回信号值: 信号由主运行中心自动生成,不得 在.cpp文件中实现。它们不能有返回类型(即。 使用void) 相关问题: 但是,从我的试验(Qt 4.8.1)中,我可以看出返回值确实有效: 如果信号/插槽位于同一线程中,则ConnectionType可能是Qt::AutoConnection 对于不同线程中的信号/插槽,我需要使用Qt::BlockingQueuedConnection 所以在我的代码中,我通过 QString dp = emit WscAircrafts::si

表示,不可能返回信号值:

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

相关问题:

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

  • 如果信号/插槽位于同一线程中,则ConnectionType可能是
    Qt::AutoConnection
  • 对于不同线程中的信号/插槽,我需要使用
    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;
    

    所有这些看起来都很直截了当,那么为什么这与文档有矛盾呢?使用返回值会出现什么问题?如前所述,在我的代码中,这似乎是可行的。

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

    如果信号连接到多个插槽,会发生什么情况?在另一个类似的问题回答中,它说:“似乎这是可能的。我能够发出信号,并从信号连接到的插槽接收值。但是,问题是,它只从多个连接的插槽返回最后一个返回值。”. 这一定是他们不想做广告的原因feature@RomanSaveljev-它是否也必须阻塞,直到插槽完成?当然,在某些情况下,这无法工作。但在大多数情况下,这取决于您如何设置连接。例如,使用Qt::SingleConnection不会有多个插槽的风险,使用Qt::BlockingQueuedConnection一次只有一个返回值。“永不有返回值”(doc)与IMHO明智使用不同。尽管如此,可能会有副作用,但仍然有许多返回值非常有用的用例。即使可能,它也可能不可取,因为它违反了COMMAND查询分离原则。换句话说,返回值的信号可能使您的程序难以让读者理解和推理。大多数读者可能认为信号是命令。信号是解耦的,但返回值的解耦程度较低。但这也意味着,如果返回类型合适,并且所有操作都正确,那么使用它们就没有问题。@HorstWalter是的,除非连接排队(在这种情况下,延迟的插槽调用可能会占用长时间释放的内存,但我没有深入检查)或者有多个插槽连接到信号(在这种情况下,您只能得到最后一个插槽的结果)。
    case 4: { QString _r = _t->slotAircraftJsonArray();
      if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; }  break;