вызов QMetaObject :: invokeMethod () с переменным количеством параметров - PullRequest
4 голосов
/ 11 октября 2011

Я портирую Slim-сервер FitNesse в данный момент, и я как бы застрял прямо сейчас. Что я получаю, так это строки:

("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 нуждается в очень конкретной информации, что затрудняет выполнение этого с переменным количеством аргументов. С другой стороны, должен быть способ, чтобы мне не приходилось делать одно и то же дважды (или позже: десять) раз.

Итак, вопрос в том, есть ли другой способ сделать это одним вызовом?

1 Ответ

9 голосов
/ 11 октября 2011

Если вы посмотрите на определение функции, вы увидите, что есть только одна версия:

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 ] );

Аргументы, которые вы не используете, будут инициализированы по умолчанию, что является поведением по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...