一、QVariant
QVariant可以存储任意数据类型
如果要使自定义类型或其他非QMetaType内置类型在QVariant中使用,必须使用该宏Q_DECLARE_METATYPE
,如果非QMetaType内置类型要在信号与槽中使用,必须使用qRegisterMetaType
。
1.构造函数
QVariant(bool b);
QVariant(double d);
QVariant(const QString &string);
QVariant(const QList<QVariant> &list);
//...所有Qt内置类型都支持,其他不再列举
2.赋值
QVariant v1 = 12;
QVariant v2 = "test"; //v2类型为QString
QVariant v3;
v3.setValue(2.0f);
注意:自定义类型(包括std::string等)都需要使用setValue()
赋值,不能直接使用构造函数和=
赋值。
3.取值
在已知取值结果类型的前提下可以直接使用toInt()等函数
int toInt(bool* ok = Q_NULLPTR) const;
uint toUInt(bool* ok = Q_NULLPTR) const;
QList<QVariant> toList() const;
QPoint toPoint() const;
QRect toRect() const;
//Qt中定义的类型都支持,其他不再列举
如果是自定义类型,或不知道取值结果的类型是什么,可以先使用canConvert<type>()
判断是否可以转换
4.指针的存取
int arr[]{ 1,2,3 };
//保存
QVariant varP = QVariant::fromValue((void*)arr);
//获取
int* r1 = (int*)varP.value<void*>();
QVariant v4; v4.setValue(r1); //此处不能用arr
auto* r2 = v4.value<int*>();
5.完整代码示例
#include <QVariant>
#include <QDebug>
Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(int*)
int main()
{
std::string str = "test";
QVariant v1 = 12;
QVariant v2; v2.setValue(str); //非Qt(C++)内置类型必须用setValue赋值
//QVariant v2 = "test"; //此时的v2只能转为QString,不能直接转为std::string
QVariant v3;
v3.setValue(2.0f);
auto val1 = v3.value<float>();
auto val2 = v3.toFloat();
bool can1 = v2.canConvert<float>(); //false
bool can2 = v2.canConvert<std::string>();//true
bool can3 = v2.canConvert<int>(); //false
bool can4 = v2.canConvert<QString>(); //false
auto val3 = v2.value<std::string>();
int arr[]{ 1,2,3 };
//保存
QVariant varP = QVariant::fromValue((void*)arr);
//获取
int* r1 = (int*)varP.value<void*>();
QVariant v4; v4.setValue(r1); //此处不能用arr,因为arr是数组,不是int*
auto* r2 = v4.value<int*>();
qDebug("test");
return 0;
}