Могут ли сигналы Qt возвращать значение?

Boost.Signals позволяет различные стратегии использования возвращаемых значений слотов для формирования возвращаемого значения сигнала. Например, добавляя их, формируя из них вектор или возвращая последний.

Распространенная мудрость (выраженная в документации Qt [EDIT: ], а также некоторые ответы на этот вопрос ] ) заключается в том, что это невозможно с сигналами Qt.

Однако, когда я запускаю moc для следующего определения класса:

class Object : public QObject {
    Q_OBJECT
public:
    explicit Object( QObject * parent=0 )
        : QObject( parent ) {}

public Q_SLOTS:
    void voidSlot();
    int intSlot();

Q_SIGNALS:
    void voidSignal();
    int intSignal();
};

Не только moc не жалуется на сигнал с типом возврата non-void, похоже, он активно реализует его таким образом, чтобы разрешить передать возвращаемое значение:

// SIGNAL 1
int Object::intSignal()
{
    int _t0;
    void *_a[] = { const_cast(reinterpret_cast(&_t0)) };
    QMetaObject::activate(this, &staticMetaObject, 1, _a);
    return _t0;
}

Итак: согласно документации, это невозможно. Тогда что здесь делает moc?

Слоты могут иметь возвращаемые значения , поэтому можем ли мы теперь соединить слот с возвращаемым значением с сигналом с возвращаемым значением? В конце концов, такое ли возможно? Если да, то насколько это полезно?

РЕДАКТИРОВАТЬ: Я не прошу обходных путей, поэтому, пожалуйста, не предоставляйте их.

РЕДАКТИРОВАТЬ: Очевидно, что это бесполезно в Qt :: QueuedConnection режим (впрочем, как и QPrintPreviewWidget API , он все еще существует и полезен). Но как насчет Qt :: DirectConnection и Qt :: BlockingQueuedConnection (или Qt :: AutoConnection , когда он разрешается в Qt :: DirectConnection ]).

51
задан Community 23 May 2017 в 02:34
поделиться