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

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

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

Из API QVariant я определил это:

bool QVariant::canConvert ( Type t ) const

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

Так, каков был бы надежный способ проверить, какой usertype хранится в QVariant?

8
задан rasjani 7 July 2010 в 08:54
поделиться

1 ответ

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

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

EDIT :

Возможно, это зависит от того, как вы задаете 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 
14
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: