Как проверить Qvariant типа Qvariant :: usertype ожидается?

StackOverflow https://stackoverflow.com/questions/3193275

  •  02-10-2019
  •  | 
  •  

Вопрос

Я пишу код тестирования, который будет автоматически итерации через все виджеты Q_PROPERTY, и некоторые свойства используют типы, которые зарегистрированы через QRegisterMetatype. Если я хочу прочитать/написать их в Qvariant, мне нужно использовать Qvariant :: userType при хранении их в варианте. Все идет нормально.

Но когда я хочу проверить чтение и писать об этих свойствах, мне также нужно знать их тип. Для вещей, которые уже являются стандартными типами QT, я могу сделать это через Qvariant :: type (), но, как у меня есть много пользовательских, как это будет достигнуто?

Из API Qvariant я заметил это:

bool QVariant::canConvert ( Type t ) const

Но я немного сомневаюсь, приведет ли это к неправильным типам в случае перечисления?

Итак, каким образом будет надежный способ проверить, какой тип пользователя хранится в Qvariant?

Это было полезно?

Решение

Для пользовательских типов есть Qvariant :: usertype (). Анкет Он работает как Qvariant :: type (), но возвращает целое число идентификатора типа пользователя, определенного типа, тогда как Qvariant :: type () всегда возвращает Qvariant :: userType.

Есть также Qvariant :: typename () который возвращает имя типа как строку.

РЕДАКТИРОВАТЬ :

Вероятно, это зависит от того, как вы устанавливаете Qvariant. Непосредственно с использованием Qvariant :: Qvariant (int type, const void * copy) обескуражен.

Скажем, у меня есть три типа, как это:

class MyFirstType
{ 
    public:
        MyFirstType();
        MyFirstType(const MyFirstType &other);
        ~MyFirstType();

        MyFirstType(const QString &content);

        QString content() const;

    private:
        QString m_content;
};
Q_DECLARE_METATYPE(MyFirstType);

Третий без q_declare_metatype

Я храню их в Qvariant:

 QString content = "Test";

 MyFirstType first(content);

 MySecondType second(content);

 MyThirdType third(content);

 QVariant firstVariant;
 firstVariant.setValue(first);

 QVariant secondVariant = QVariant::fromValue(second);

 int myType = qRegisterMetaType<MyThirdType>("MyThirdType");

 QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed

 qDebug() << "typeName for first :" << firstVariant.typeName();
 qDebug() << "UserType :" << firstVariant.userType();
 qDebug() << "Type : " << firstVariant.type();

 [...]

Я получил :

typeName for first : MyFirstType 
UserType : 256 
Type :  QVariant::UserType 

typeName for second : MySecondType 
UserType : 257 
Type :  QVariant::UserType 

typeName for third : MyThirdType 
UserType : 258 
Type :  QVariant::UserType 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top