0

我想在其他线程中调用 QObject 的任意槽。

我有:

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

我想:

<something>                |  array         | YES

我不想做一些事情,比如根据参数的数量复制 invokeMethod 代码。

在哪里获得接受参数数组的调用方法或如何使 qt_metacall 排队?

4

2 回答 2

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 回答
0

您可以:

  1. 使用与您要调用的插槽相同的默认参数编写一个信号,将其连接到插槽Qt::QueuedConnection并使用您的数组调用该信号qt_metacall,或者
  2. 编写一个QObject派生类:
    • 将您的参数数组作为其构造函数的参数,并将其存储在内部,
    • QMetaObject::invokeMethod在构造函数中调用 with以Qt::QueuedConnection调用不带参数的插槽,该插槽将qt_metacall在删除QObject.

Qt 在内部使用第二种方法,但有一个内部类:(QMetaCallEventcorelib/kernel/qobject_p.h 中)而postEvent不是信号/插槽连接。

于 2011-10-04T00:32:25.217 回答