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,如何传递参数?
答案 0 :(得分:-1)
您可以准备此功能:
QGenericArgument convertType(const QString& source, const QVariant::Type requiredType);
在其中使用switch
es和Q_ARG
。
然后,参数的大switch
计数在其中invoke
。