Как проверить QVariant типа QVariant :: UserType ожидаемого типа? - PullRequest
8 голосов
/ 07 июля 2010

Я пишу тестовый код, который будет автоматически перебирать все виджеты Q_PROPERTY, а некоторые свойства используют типы, которые зарегистрированы через qRegisterMetaType.Если я хочу прочитать / записать их в QVariant, мне нужно использовать QVariant :: UserType при сохранении их в варианте.Пока все хорошо.

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

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

bool QVariant::canConvert ( Type t ) const

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

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

1 Ответ

13 голосов
/ 07 июля 2010

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

Существует также QVariant :: typeName() , который возвращает имя типа в виде строки.

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

Вероятно, это зависит от того, как вы установили QVariant.Непосредственное использование QVariant :: QVariant (тип int, 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 
...