Qt: значение возвращаемого значения слота?

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


Вот пример того, о чем я говорю. это взято из кода, сгенерированного moc. 'message' - это слот, который ничего не возвращает, а 'selectPart' объявлен как возвращающий int.

case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break;
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])));
    if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; }  break;

person shoosh    schedule 22.09.2008    source источник


Ответы (4)


Возвращаемое значение полезно только в том случае, если вы хотите вызвать слот как обычную функцию-член:

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QObject* parent);
    void Something();
public Q_SLOTS:
    int Other();
};

void MyClass::Something() { int res = this->Other(); ... }

Изменить: кажется, что это не единственный способ использования возвращаемого значения, метод QMetaObject::invokeMethod может использоваться для вызова слота и получения возвращаемого значения. Хотя кажется, что это немного сложнее сделать.

person Terence Simpson    schedule 30.09.2008

Просматривая исходный код Qt, кажется, что когда слот вызывается из QMetaObject::invokeMethod, можно указать тип возвращаемого значения и получить возвращаемое значение. (Посмотрите на invokeMethod в справке Qt)

Я не смог найти много примеров того, как это действительно используется в исходном коде Qt. Один, который я нашел, был

bool QAbstractItemDelegate::helpEvent 

который является слотом с возвращаемым типом и вызывается из

QAbstractItemView::viewportEvent

используя метод вызова.

Я думаю, что возвращаемое значение для слота доступно только при прямом вызове функции (когда это обычная функция C++) или при использовании invokeMethod. Я думаю, что это действительно предназначено для внутренних функций Qt, а не для обычного использования в программах, использующих Qt.

Изменить: для примера:

case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])), *reinterpret_cast< int(*)>(_a[2])));
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; }  break;

вектор _a — это список аргументов, которые передаются в qt_metacall. Это передается QMetaObject::invokeMethod. Таким образом, возвращаемое значение в сгенерированном коде moc сохраняется и передается обратно вызывающей стороне. Таким образом, для обычных взаимодействий сигнал-слот возвращаемое значение вообще ни для чего не используется. Однако существует механизм, позволяющий получить доступ к возвращаемым значениям из слотов, если слот вызывается через invokeMethod.

person David Dibben    schedule 22.09.2008

Это очень полезно, когда вы имеете дело с динамическим языком, таким как qtscript, JavaScript, QtPython и так далее. С этим языком/привязками вы можете динамически использовать C++ QObject, используя интерфейс, предоставляемый MetaObject. Как вы, наверное, знаете, moc анализирует только сигналы и слоты и генерирует описание MetaObject. Итак, если вы используете C++ QObject из привязки javascript, вы сможете вызывать только слоты, и вам понадобится возвращаемое значение. Часто привязки Qt для динамических языков предоставляют некоторые возможности для доступа к обычному методу, но этот процесс определенно более сложен.

person FxIII    schedule 01.02.2010
comment
взгляните на QWebFrame::addToJavaScriptWindowObject и подумайте, как разрешить javascript в этом фрейме получать данные из добавленного вами объекта. - person FxIII; 12.10.2010

Все слоты доступны в QMetaObject, где к объекту можно получить доступ через отражающий интерфейс.

Например, QMetaObject::invokeMethod() принимает параметр QGenericReturnArgument. Так что я считаю, что это не для явного использования слота, а скорее для динамического вызова методов в целом. (Есть и другие способы предоставления методов QMetaObject, кроме превращения их в слоты.)

Например, функция invokeMethod используется различными динамическими языками, такими как QML и Javascript, для вызова методов QObject:s. (Есть также мост Python-Qt под названием PythonQt, который использует это. Не путать с PyQt, который является полной оболочкой.)

Возвращаемое значение используется при выполнении синхронных вызовов между потоками внутри приложения Qt (поддерживается через invokeMethod и установкой типа соединения Qt::BlockingQueuedConnection, для которого есть следующая документация:

То же, что и QueuedConnection, за исключением того, что текущий поток блокируется до возврата из слота. Этот тип подключения следует использовать только в том случае, если отправитель и получатель находятся в разных потоках. Примечание. Нарушение этого правила может привести к зависанию приложения.

person Macke    schedule 07.01.2011