使用QueuedConnection调用带数组或参数的方法

时间:2011-10-03 19:23:04

标签: multithreading qt invoke metaobject

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

我有:

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

我想:

<something>                |  array         | YES

我不想做基于参数数量复制invokeMethod代码的事情。

从何处获取接受参数数组的invokeMethod或如何使qt_metacall排队?

2 个答案:

答案 0 :(得分:0)

你可以:

  1. 使用与您要拨打的插槽相同的默认参数编写信号,使用Qt::QueuedConnection将其连接到插槽,并使用qt_metacall和您的阵列调用信号,或
  2. 编写一个QObject派生类:
    • 将您的参数数组作为其构造函数的参数,并将其存储在内部,
    • 使用QMetaObject::invokeMethod在构造函数中调用Qt::QueuedConnection来调用不带参数的插槽,该插槽将在删除qt_metacall之前使用存储的参数数组调用QObject
  3. 内部Qt使用第二种方法,但使用内部类:QMetaCallEvent(在corelib/kernel/qobject_p.h中)和postEvent而不是信号/插槽连接。

答案 1 :(得分: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]);