#qt
#qt
Вопрос:
Я получаю данные в формате JSON с помощью QJsonObject
. У меня также есть QObject
объект на основе a, содержащий свойства, используя Q_PROPERTY(...)
, для ключей в JSON. Поскольку Qt теперь имеет еще несколько типов данных, чем JSON, как можно проверить, являются ли они конвертируемыми.
Типы данных, используемые в объекте, обычно являются одним из следующих, но не ограничиваются
uint
double
QString
QDateTime
bool
Идея состоит в том, чтобы автоматически вызывать setProperty(...)
производный объект QOject для каждого ключа / значения в QJsonObject
. Поскольку это может привести к сбою из-за неправильного ввода в JSON, я должен проверить достоверность на основе данных QMetaProperty
and QJsonObject/QVariantMap
.
Поскольку это должно выполняться generic как базовый класс, реализация ручных проверок для каждого типа данных завершается неудачей. Я знаю, что есть QVariant::isConvertible<T>()
.
#include <QJsonObject>
#include <QVariant>
#include <QMetaObject>
#include <QMetaProperty>
class Test {
Q_GADGET
Q_PROPERTY(QString test)
QString m_test;
QJsonObject jo;
void call();
}
void Test::call()
{
jo.insert("test",QJsonValue(5));
// This will fail, since int is not convertible to QString implicitly
staticMetaObject->property(staticMetaObject->propertyOffset()).writeOnGadget(this,jo["test"].toVariant());
}
Поскольку я анализирую JSON перед тем, как проверить, будет ли у каждого свойства соответствующий ключ в JSON-объекте, мне действительно нравится перехватывать их там уже без изменения моего исходного объекта. Что-то вроде:
jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()
Комментарии:
1. На самом деле я нашел решение в последней строке… Есть
bool QVariant::canConvert(int targetTypeId)
…
Ответ №1:
Вместо использования bool QVariant::canConvert<T>()
шаблонного можно использовать bool QVariant::canConvert(int targetTypeId)
.
QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset());
jo["test"].toVariant().canConvert(po.type());