26

ドキュメントによると、スロットからの戻り値は何の意味もありません。
しかし、生成された moc コードでは、スロットが値を返す場合、この値が何かに使用されていることがわかります。それは何をしますか?


これが私が話していることの例です。これは、moc によって生成されたコードから取得されます。「メッセージ」は何も返さないスロットで、「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;
4

4 に答える 4

15

戻り値は、スロットを通常のメンバー関数として呼び出したい場合にのみ役立ちます。

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 メソッドを使用してスロットを呼び出し、戻り値を取得できます。少し複雑なように思えますが。

于 2008-09-30T17:25:34.083 に答える
12

Qtソースを見ると、スロットがQMetaObject :: invokeMethodから呼び出されたときに、戻りタイプを指定して戻り値を取得できるようです。(QtヘルプのinvokeMethodを見てください)

Qtソースで実際に使用されている例は多くありませんでした。私が見つけたのは

bool QAbstractItemDelegate::helpEvent 

これはリターンタイプのスロットで、から呼び出されます

QAbstractItemView::viewportEvent

invokeMethodを使用します。

スロットの戻り値は、関数が直接呼び出された場合(通常の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を介して呼び出された場合に、スロットからの戻り値にアクセスできるようにするメカニズムが存在します。

于 2008-09-22T03:00:37.797 に答える
6

qtscriptJavaScriptQtPythonなどの動的言語を扱うときに非常に便利です。この言語/バインディングを使用すると、MetaObjectが提供するインターフェースを使用してC++QObjectを動的に使用できます。ご存知かもしれませんが、シグナルとスロットだけがmocによって解析され、メタオブジェクト記述が生成されます。したがって、JavaScriptバインディングからC ++ QObjectを使用している場合は、スロットだけを呼び出すことができ、戻り値が必要になります。多くの場合、動的言語のQtバインディングは、通常のメソッドにアクセスするための機能を提供しますが、プロセスは間違いなくもっと厄介です。

于 2010-02-01T14:59:48.427 に答える
5

すべてのスロットは QMetaObject で公開され、リフレクティブ インターフェイスを介してオブジェクトにアクセスできます。

たとえば、QMetaObject::invokeMethod()QGenericReturnArgumentパラメーターを取ります。したがって、これは明示的なスロットの使用ではなく、一般的なメソッドの動的呼び出しのためだと思います。(メソッドを QMetaObject に公開するには、メソッドをスロットにする以外の方法もあります。)

このinvokeMethod関数は、たとえば、QML や Javascript などのさまざまな動的言語で のメソッドを呼び出すために使用されますQObject:s(これを使用するPythonQtと呼ばれる Python-Qt ブリッジもあります。完全なラッパーであるPyQtと混同しないでください。)

戻り値は、Qt アプリケーション内のスレッド間で同期呼び出しを行うときに使用されます (invokeMethod を介してサポートされ、接続タイプを に設定しQt::BlockingQueuedConnectionます。次のドキュメントがあります)。

スロットが戻るまで現在のスレッドがブロックされることを除いて、QueuedConnection と同じです。この接続タイプは、エミッターとレシーバーが異なるスレッドにある場合にのみ使用してください。注: この規則に違反すると、アプリケーションがデッドロックする可能性があります。

于 2011-01-07T13:31:30.073 に答える