كيفية التحقق من QVariant من النوع QVariant :: المستخدم هو النوع المتوقع؟
سؤال
أنا أكتب رمز الاختبار الذي يكرر تلقائيًا من خلال جميع أجهزة التشغيل 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 () الذي يرجع اسم النوع كسلسلة.
تعديل :
ربما يعتمد ذلك على كيفية تعيين QVARAINT. باستخدام مباشرة 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