كيفية التحقق من QVariant من النوع QVariant :: المستخدم هو النوع المتوقع؟

StackOverflow https://stackoverflow.com/questions/3193275

  •  02-10-2019
  •  | 
  •  

سؤال

أنا أكتب رمز الاختبار الذي يكرر تلقائيًا من خلال جميع أجهزة التشغيل 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 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top