2011-10-11 117 views
4

我現在正在移植FitNesse的Slim-server,我現在有點兒被卡住了。 什麼I'm越來越像這些字符串:
用可變數量的參數調用QMetaObject :: invokeMethod()

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

其中「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))) 

等等...

因此,一方面,似乎每invokeMethod中調用需要非常具體的信息,這使得它很難與一個做可變數量的參數。另一方面,必須有一種方法,所以我不必在兩次(或更晚:十次)時間內做同樣的事情。

所以問題是,還有另一種方法來做一個電話?

回答

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()) 

在你的情況,這是我會做什麼:

QGenericArgument argumentTable[ 10 ]; 

... Fill up your data 

QMetaObject::invokeMethod(objet, functionName, argumentTable[ 0 ], argumentTable[ 1 ], 
    argumentTable[ 2 ], ... argumentTable[ 9 ]); 

的參數你不使用會默認初始化,這是默認行爲

+0

它似乎起初工作,但它不是。 它試圖用正確的參數調用正確的方法,但它失敗。例如: :AddFixture :: setSummand1(QVariant)通常有效,但現在不會 – LarissaGodzilla

+0

您可以發佈您的代碼嗎? – crazyjul

+0

問題是我將methodName-String轉換爲了Lower,所以名稱沒有匹配。 但現在它可以工作,所以謝謝。 – LarissaGodzilla

相關問題