我想在其他线程中调用QObject的任意槽。
我有:
| Arguments: | Can use QueuedConnection?
QMetaObject::invokeMethod | fixed number | YES
qt_metacall | array | NO
我想:
<something> | array | YES
我不想做基于参数数量复制invokeMethod代码的事情。
从何处获取接受参数数组的invokeMethod或如何使qt_metacall排队?
答案 0 :(得分:0)
你可以:
Qt::QueuedConnection
将其连接到插槽,并使用qt_metacall
和您的阵列调用信号,或QObject
派生类:
QMetaObject::invokeMethod
在构造函数中调用Qt::QueuedConnection
来调用不带参数的插槽,该插槽将在删除qt_metacall
之前使用存储的参数数组调用QObject
。内部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]);