Проверьте, конвертируется ли QVariant в другой тип QVariant

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