QVariant是Qt框架中一个功能强大的变体类,它提供了一种通用的方式来存储Qt对象及其他类的值,能够以类似于指针的方式存储任意类型的值。
一、 主要特性
- 通用性:QVariant可以存储几乎所有数据类型,包括基本数据类型(如整数、浮点数、布尔值等)、字符串、日期和时间、颜色等,以及Qt的各种对象类型和自定义数据类型。
- 自动类型转换:QVariant具有自动类型转换的功能,可以在需要时将存储的数据自动转换为目标类型。但需要注意的是,如果转换失败,则可以使用
canConvert()
函数进行检查,或者使用value<T>()
进行显式转换。 - 类型安全:QVariant提供了类型安全的操作,可以在运行时检查数据类型,并在类型不匹配时进行错误处理。
- 跨线程支持:QVariant支持在不同线程之间安全地传递和操作数据,因此非常适合多线程应用程序的开发。
二、常用方法
- QVariant() : 创建一个无效的 QVariant 对象。
- QVariant(Type type) : 创建指定类型的 QVariant 对象.
- QVariant(const char *str) : 创建包含 const char* 类型数据的 QVariant对象。
- QVariant(int value), QVariant(double value), QVariant(constQString &value), QVariant(const QByteArray &value), QVariant(const QDate &value),等 : 以指定类型和值初始化 QVariant 对象。
- bool isValid()const : 返回 QVariant 是否包含有效数据。
- Type type()const : 返回 QVariant 的类型枚举值。
- QString typeName()const : 返回 QVariant 的类型名称字符串。
- void clear() : 清除 QVariant 中的数据,将其设为无效。
- bool canConvert(Type targetType)const : 检査 QVariant 是否可以转换为指定的类型。
- bool convert(Type targetType)const : 将 QVariant 转换为指定类型。
- T value() const : 返回 QVariant 的值,模板函数,根据实际类型传递类型参数。
三、使用方法
1、存储数据:可以通过QVariant的构造函数将数据直接存储在QVariant对象中。例如:
QVariant var = 10; // 存储整数值10
QVariant str = "Hello"; // 存储字符串"Hello"
2、转换数据类型:可以使用toXXX()
函数将QVariant对象中的数据转换为其他数据类型。例如:
QVariant var = "10"; // 存储字符串"10"
int i = var.toInt(); // 将字符串转换为整数类型,并赋值给变量i
3、判断数据类型:可以使用type()
函数获取QVariant对象中存储的数据类型。例如:
QVariant var = "Hello";
if (var.type() == QVariant::String) {
qDebug() << "var is a string";
}
4、判断是否为空:可以使用isNull()
函数判断QVariant对象是否为空。例如:
QVariant var;
if (var.isNull()) {
qDebug() << "var is null";
}
5、存储自定义类型:QVariant可以存储自定义类型,但需要实现该类型的QDataStream
插入和提取操作符,并调用Q_DECLARE_METATYPE()
宏为该类型添加元数据。例如:
class MyCustomType {
public:
MyCustomType() {}
MyCustomType(int i, QString str) : m_i(i), m_str(str) {}
int m_i;
QString m_str;
};
Q_DECLARE_METATYPE(MyCustomType);
QDataStream& operator<<(QDataStream &out, const MyCustomType &val) {
out << val.m_i << val.m_str;
return out;
}
QDataStream& operator>>(QDataStream &in, MyCustomType &val) {
in >> val.m_i >> val.m_str;
return in;
}
// 使用QVariant存储自定义类型
QVariant customVariant = QVariant::fromValue(MyCustomType(1, "Hello"));
MyCustomType temp = customVariant.value<MyCustomType>();
qDebug() << temp.m_i << " " << temp.m_str;
觉得有帮助的话,打赏一下呗。。