QVariant與自定義類型互轉之奇巧淫技

一、看圖說話

QVariant原本就支持了很多的類型,如int、double、QString、QSize等。

那麼,如何讓QVariant支持自定義類型。

只需使用一條Q_DECLARE_METATYPE,將類型定義爲元數據類型,即可。

struct Student
{
    QString name;
    int age;
};
Q_DECLARE_METATYPE(Student)

定義2個測試函數

void setVariant(const QVariant& value)
{
    qDebug() << "setVariant";
}

void setStudent(const Student& stu)
{
    qDebug() << "setStudent" << stu.name << stu.age;
}

自定義類型與QVariant互轉

Student stu1;
stu1.name = "hh";
stu1.age = 10;

// 自定義類型轉QVariant
QVariant variant;
variant.setValue<Student>(stu1);
setVariant(variant);

// QVariant轉自定義類型
Student stu2;
stu2 = variant.value<Student>();
setStudent(stu2);

神馬,你說這樣太麻煩,好。
在這裏插入圖片描述

自定義類型轉QVariant,還有一個函數,可以直接轉,如下:

setVariant(QVariant::fromValue(stu1));

在這裏插入圖片描述

好,繼續。

我們在Student結構體中添加一個函數,如下:

struct Student
{
    QString name;
    int age;

    operator QVariant() const
    {
        return QVariant::fromValue(*this);
    }
};
Q_DECLARE_METATYPE(Student)

就可以使用,更加簡單的,自定義類型轉QVariant,如下:

setVariant(stu1); 

另外,我們再在Student結構體中添加1個構造函數Student(const QVariant& variant),如下:

struct Student
{
    QString name;
    int age;

    operator QVariant() const
    {
        return QVariant::fromValue(*this);
    }

    Student() {}
    Student(const QVariant& variant)
    {
        *this = variant.value<Student>();
    }
};
Q_DECLARE_METATYPE(Student)

又可以使用,更加簡單的,QVariant轉自定義類型,如下:

setStudent(variant);

以上2種類型轉換方式,原理,可參考《c++ 中 operator 使用小結》。

二、總結

在這裏插入圖片描述

Student stu1;
stu1.name = "hh";
stu1.age = 10;

// 自定義類型轉QVariant,用法1
QVariant variant;
variant.setValue<Student>(stu1);
setVariant(variant);

// 自定義類型轉QVariant,用法2
setVariant(QVariant::fromValue(stu1));

// 自定義類型轉QVariant,用法3
setVariant(stu1); // 需要在結構體添加operator QVariant() const函數

// QVariant轉自定義類型,用法1
Student stu2;
stu2 = variant.value<Student>();
setStudent(stu2);

// QVariant轉自定義類型,用法2
setStudent(variant); // 需要在結構體添加Student(const QVariant& variant)構造函數

具體用哪種,請各位客官大老爺,自行選擇。

慣例,代碼地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/44QVariant/QVariantStruct


===================================================

===================================================

業餘時間不定期更新一些想法、思考文章,歡迎關注,共同探討,沉澱技術!

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章