如何使用QStrings数组调用QMetaMethod?

时间:2016-09-11 17:54:13

标签: c++ qt reflection

QMetaObject系统提供了一些基本的反射API。我想要做的是调用通过该系统可用的给定插槽或方法。

但是,方法的参数和名称最初都是QString值。文档显示了一个示例:

QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj,
              Qt::DirectConnection,
              Q_RETURN_ARG(QString, retVal),
              Q_ARG(QString, "sqrt"),
              Q_ARG(int, 42),
              Q_ARG(double, 9.7));
     

如果“compute”插槽没有恰好一个QString,则一个int和   一个双按指定顺序,呼叫将失败

强调我的。现在有了这个例子,我很无能为力。它显然使用模板,这在动态上下文中是无用的。当我可以直接调用该方法时,我并没有真正看到静态使用此API的目的。

所以我想说我有这个功能:

void invokeSlot(QObject* target, const QString& slotName, const QStringList& arguments) {
    // This is how I can get list of overloads by given name
    const QMetaObject* obj = target_->metaObject();
    QList<QMetaMethod> overloads;
    for (int i = 0, l = obj->methodCount(); i < l; ++i) {
        const QMetaMethod method = obj->method(i);
        if( method.name() == name )
            overloads.append(method);
    }        
    // Now how to convert the arguments?
}

您可以假设我已为类型转换准备了此方法:

QVariant convertType(const QString& source, const QVariant::Type requiredType);

但即使我选择了正确的重载并将字符串转换为所需类型的QVariants,如何传递参数?

1 个答案:

答案 0 :(得分:-1)

您可以准备此功能:

QGenericArgument convertType(const QString& source, const QVariant::Type requiredType);

在其中使用switch es和Q_ARG

然后,参数的大switch计数在其中invoke