0

別のスレッドで QObject の任意のスロットを呼び出したい。

私は持っている:

                           |  Arguments:    | Can use QueuedConnection?
QMetaObject::invokeMethod  |  fixed number  | YES
qt_metacall                |  array         | NO

私が欲しい:

<something>                |  array         | YES

引数の数に基づいてinvokeMethodコードを複製するようなことはしたくありません。

引数の配列を受け入れるinvokeMethodを取得する場所、またはqt_metacallをキューに入れる方法は?

4

2 に答える 2

0

次のいずれかを実行できます。

  1. 呼び出したいスロットと同じデフォルト パラメータで信号を書き込み、それをスロットに接続し、配列でQt::QueuedConnection信号を呼び出します。qt_metacall
  2. 次のようなQObject派生クラスを作成します。
    • パラメーター配列をコンストラクターのパラメーターとして受け取り、内部に保存します。
    • を削除する前に格納されたパラメーター配列を使用して呼び出す、パラメーターなしでスロットを呼び出すために、コンストラクターで with を呼び出しQMetaObject::invokeMethodます。Qt::QueuedConnectionqt_metacallQObject

内部的に Qt は 2 番目の方法を使用しますが、内部クラスQMetaCallEvent( corelib/kernel/qobject_p.h 内) をpostEvent使用し、シグナル/スロット接続の代わりに使用します。

于 2011-10-04T00:32:25.217 に答える
0

GenericArgument で初期化された配列を作成して回避します。

QGenericArgument args[] = {
            QGenericArgument(), ....... ,QGenericArgument(),};

for (int p = 0; p < parameterTypes.count(); ++p) {
    QVariant::Type type = QVariant::nameToType(parameterTypes.at(p));

    switch(type) {
    case QVariant::String:
        args[p] = Q_ARG(QString, obtainTheNextStringArgument());
        break;
    // the rest needed types here        
    }
}

mm.invoke(object, Qt::QueuedConnection, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8],args[9]);
于 2011-10-04T14:44:54.030 に答える