一、看圖說話
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
===================================================
===================================================
業餘時間不定期更新一些想法、思考文章,歡迎關注,共同探討,沉澱技術!