Как проверить Qvariant типа Qvariant :: usertype ожидается?
Вопрос
Я пишу код тестирования, который будет автоматически итерации через все виджеты 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