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

Lar*_*lla 4 c++ qt

我此刻正在移植FitNesse的Slim-server,我现在有点卡住了.我得到的是这样的字符串:

("id_4", "call", "id", "setNumerator", "20")
("id_5", "call", "id", "setSomethingElse", "10", "8")
Run Code Online (Sandbox Code Playgroud)

其中"setNumerator"和"setSomethingElse"是应该调用的方法的名称,"20","10"和"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)))
Run Code Online (Sandbox Code Playgroud)

等等......

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

所以问题是,是否有另一种方法可以通过一次通话完成?

cra*_*jul 9

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

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() )
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这就是我要做的:

QGenericArgument argumentTable[ 10 ];

... Fill up your data

QMetaObject::invokeMethod( objet, functionName, argumentTable[ 0 ], argumentTable[ 1 ],
    argumentTable[ 2 ], ... argumentTable[ 9 ] );
Run Code Online (Sandbox Code Playgroud)

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