使用可变数量的参数调用QMetaObject::invokeMethod()

calling QMetaObject::invokeMethod() with variable amount of parameters

本文关键字:QMetaObject 调用 invokeMethod 参数      更新时间:2023-10-16

我现在正在移植FitNesse的slim服务器,我现在有点卡住了。我得到的是这样的字符串:

("id_4", "call", "id", "setNumerator", "20")
("id_5", "call", "id", "setSomethingElse", "10", "8")

其中"setNumerator"answers"setSomethingElse"是应该被调用的方法的名称," 20","10"answers"8"是我传递的参数

所以我现在的问题是,我不知道如何使用一个调用为两个方法调用invokeMethod。我当前的解决方法是这样的:

//(if instructionLength==5)
metaObj->invokeMethod(className, methodName.toAscii().constData(), Qt::DirectConnection,
                                          Q_ARG(QVariant, instructions.at(index).at(4)))
//(if instructionLength==6)
metaObj->invokeMethod(className, methodName.toAscii().constData(), Qt::DirectConnection, Q_RETURN_ARG(QVariant, retArg),
                                          Q_ARG(QVariant, instructions.at(index).at(4)),
                                          Q_ARG(QVariant, instructions.at(index).at(5)))



因此,一方面,似乎每个invokememethod调用都需要非常具体的信息,这使得使用可变数量的参数很难做到这一点。另一方面,必须有一种方法,使我不必做同样的事情两次(或以后:十次)。

问题是,有没有别的方法可以用一次调用来完成?

如果你看一下函数定义,你会发现只有一个版本:

bool QMetaObject::invokeMethod ( QObject * obj, const char * member, QGenericArgument val0 
    = QGenericArgument( 0 ), QGenericArgument val1 = QGenericArgument(), QGenericArgument 
    val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), 
    QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = 
    QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 
    = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument 
    val9 = QGenericArgument() )

对于你的情况,我会这样做:

QGenericArgument argumentTable[ 10 ];
... Fill up your data
QMetaObject::invokeMethod( objet, functionName, argumentTable[ 0 ], argumentTable[ 1 ],
    argumentTable[ 2 ], ... argumentTable[ 9 ] );

不使用的参数将默认初始化,这是默认行为