Я пишу код тестирования, который автоматически выполнит итерации через весь Q_PROPERTY виджетов, и некоторые свойства используют типы, которые регистрируются через qRegisterMetaType. Если я хочу к чтению-записи их в QVariant, я должен использовать QVariant:: UserType при хранении их в вариант.Пока все хорошо.
Но когда я хочу протестировать чтения и записи этих свойств, я должен также знать их тип. Для материала, которые уже являются стандартными спокойными типами, я могу сделать это через QVariant:: введите (), но поскольку у меня есть много usertypes, как это было бы выполнено?
Из API QVariant я определил это:
bool QVariant::canConvert ( Type t ) const
Но я немного сомневаюсь, приведет ли это к неправильным типам в случае перечислений?
Так, каков был бы надежный способ проверить, какой usertype хранится в QVariant?
Для типов, определяемых пользователем, существует 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