2012-08-09 14 views
8

Qt documentation說,信號返回值是不可能的:Qt:信號的返回值爲什麼官方文檔說它是不可能的/禁止的?

信號由商務部自動生成的,不得在.cpp文件中實現 。它們不能有返回類型(即 使用void)。

相關SO問題:

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

然而,從我的考驗(QT 4.8.1)我可以告訴返回值做的工作:

  1. 如果信號/插槽處於相同的thr EAD,ConnectionType可能是在不同的線程我需要使用Qt::BlockingQueuedConnection

所以在我的代碼通過

QString dp = emit WscAircrafts::signalAircraftsJsonArray(); 

呼叫的信號,並且信號MOC返回QStringQt::AutoConnection

  • 隨着信號/槽,

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

    這裏是slot moc,它傳遞迴QString

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

    所有這些看起來都非常直截了當,所以爲什麼與文檔相矛盾?使用返回值的問題在哪裏?如上所述,在我的代碼中,這似乎工作。

  • +3

    如果信號連接到多個插槽會發生什麼? – 2012-08-09 19:44:48

    +2

    在另一個類似的問題答案中它說:「看起來這是可能的,我能夠發出一個信號,並從信號所連接的插槽接收值,但問題是它只返回來自多個連接的插槽「。必須是他們不希望宣傳此功能的原因 – 2012-08-09 19:45:18

    +0

    @RomanSaveljev - 它是否也必須阻止,直到插槽完成? – 2012-08-09 19:48:04

    回答

    5

    問題是,在連接時沒有檢查返回類型的兼容性,因此將雙返回槽連接到浮點返回信號,例如,將溢出分配給棧(不是雙關語)的空間浮動。

    +0

    但是這也意味着,如果返回類型合適並且一切都正確完成,那麼使用它們就沒有問題。 – 2013-09-10 15:04:06

    +1

    @HorstWalter是的,除非連接排隊(在這種情況下,延遲插槽調用可能會破壞長時間釋放的內存,但我沒有深入檢查),或者存在多個連接到信號的插槽(在這種情況下, d只得到最後一個槽的結果)。 – 2013-09-10 15:19:43

    相關問題