QVariant类

QVariant类的作用类似于最常见的Qt数据类型的联合。


Header:#include <QVariant>
CMake:find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake:QT += core

【详细描述】

因为C++禁止联合中包含具有非默认构造函数或析构函数的类型,所以大多数有趣的Qt类不能在联合中使用。如果没有 QVariant,对于QObject::property()和数据库工作等方面来说,将是一个问题。

QVariant 对象一次保存单个 typeId()  的一个值(某些类型是多值的,例如字符串列表)。您可以找出QVariant所支持的类型 T,使用convert()将其转换为其他类型,使用 toT()  函数之一(例如 toSize())获取其值,并使用canConvert()检查类型是否可以转换为特定类型。

名为toT() 的函数 (例如toInt(), toString())是 const。如果请求输入存储类型,它们将返回存储对象的副本。如果你要求一个可以从存储类型生成的类型,toT() 会复制和转换,并使对象本身保持不变。如果请求的类型不能从存储类型生成,则结果取决于toT() 中的具体类型。

以下是一些演示 QVariant 使用示例代码:

QDataStream out(...);
QVariant v(123);                // 这个variant现在包含一个int
int x = v.toInt();              // x = 123
out << v;                       // 将类型标记和int写入out
v = QVariant(tr("hello"));      // 这个variant现在包含一个QString
int y = v.toInt();              // y = 0 因为v不能被转换为int
QString s = v.toString();       // s = tr("hello")
out << v;                       // 将类型标记和QString写入out
...
QDataStream in(...);            // (打开先前编写的数据流程序)
in >> v;                        // 读取 Int variant
int z = v.toInt();              // z = 123
qDebug("Type is %s",            // prints "Type is int"
        v.typeName());
v = v.toInt() + 100;            // 这个variant现在的值是223
v = QVariant(QStringList());    // 这个variant现在的值是 QStringList

您甚至可以将 QList<QVariant> 和 QMap<QString, QVariant> 值存储在一个QVariant 中,因此您可以轻松地构建任意类型的任意复杂数据结构。这非常强大且用途广泛,但与在标准数据结构中存储特定类型相比,内存和速度效率可能较低。

QVariant 还支持 null 值的概念。如果变体不包含初始化的值或包含 null 指针,则该变体为 null。

QVariant x;                                // x.isNull() == true
QVariant y = QVariant::fromValue(nullptr); // y.isNull() == true

QVariant 可以扩展为支持 QMetaType::Type枚举中提到的其他类型。详细信息,参阅 Creating Custom Qt Types 。

 关于 GUI 类型的说明 

由于QVariant是Qt Core模块的一部分,因此它无法为Qt GUI中定义的数据类型提供转换函数,例如 QColorQImageQPixmap。换句话说,没有toColor()功能。相反,您可以使用  QVariant::value() 或 qvariant_cast() 模板函数。例如:

QVariant variant;
...
QColor color = variant.value<QColor>();

对于QVariant支持的所有数据类型(例如QColor到QVariant)是自动的,包括与GUI相关的类型:

QColor color = palette().background().color();
QVariant variant = color;

 连续使用 canConvert() 和 convert()  

当连续使用canConvert() 和convert() 时,canConvert()  可以返回true,但 convert() 可以返回 false。这通常是因为canConvert() 只报告 QVariant 在给定适当数据类型之间进行转换的一般能力,实际上有可能提供了无法转换的数据。

例如,当对包含字符串的QVariant 调用canConvert(QMetaType::fromType<int>())时,将返回 true,因为原则上,QVariant 能够将数字字符串转换为整数。但是,如果字符串包含非数字字符,则无法将其转换为整数,并且任何转换该字符串的尝试都将失败。因此,必须让两个函数都返回 true 才能成功转换。

另请参见QMetaType


【公有函数】

1.构造空QVariant对象。
 

2.然后可以用setValue()函数把具体的值设置到QVariant对象中,静态函数fromValue()的功能与之等价。
 

【分两步完成对象的构建】

QVariant()

对QVariant支持的类进行了封装,最终都是返回一个QVariant类型。
 

既然最终得到的都是QVariant,那如何知道里面实际是什么类型呢?
 

可以通过typeId()函数查询,这个函数返回代表元数据ID metaType()的int值。
 

知道了QVariant对象内部的实际类型,就可以通过toT()函数将其中的数据还原使用了,例如:toByteArray()等。

QVariant(QMetaType type, const void *copy = nullptr)
QVariant(QLineF val)
QVariant(QRect val)
QVariant(QRectF val)
QVariant(const QEasingCurve &val)
QVariant(const QJsonDocument &val)
QVariant(const QPersistentModelIndex &val)
QVariant(const char *val)
QVariant(QLatin1StringView val)
QVariant(std::in_place_type_t<T>, Args &&... args)
QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args &&... args)
QVariant(int val)
QVariant(uint val)
QVariant(qlonglong val)
QVariant(qulonglong val)
QVariant(bool val)
QVariant(double val)
QVariant(float val)
QVariant(QChar c)
QVariant(QDate val)
QVariant(QTime val)
QVariant(const QBitArray &val)
QVariant(const QByteArray &val)
QVariant(const QDateTime &val)
QVariant(const QHash<QString, QVariant> &val)
QVariant(const QJsonArray &val)
QVariant(const QJsonObject &val)
QVariant(const QList<QVariant> &val)
QVariant(const QLocale &l)
QVariant(const QMap<QString, QVariant> &val)
QVariant(const QRegularExpression &re)
QVariant(const QString &val)
QVariant(const QStringList &val)
QVariant(const QUrl &val)
QVariant(const QJsonValue &val)
QVariant(const QModelIndex &val)
QVariant(QUuid val)
QVariant(QSize val)
QVariant(QSizeF val)
QVariant(QPoint val)
QVariant(QPointF val)
QVariant(QLine val)
QVariant(const QVariant &p)
QVariant(QVariant &&other)
析构。~QVariant()
boolcanConvert(QMetaType type) const如果variant可以强制转换为请求的类型type,则返回true。这种强制转换是在调用  toInt(), toBool(),......等方法。
boolcanConvert() const

如果Variant可以转换为模板类型T,则返回true,否则返回false。

boolcanView() const
voidclear()将variant转换为QMetaType::UnknownType 类型并释放使用的任何资源。
const void *constData() const
boolconvert(QMetaType targetType)
void *data()

返回指向包含对象的指针,该指针为可以写入的通用void*。

该函数分离QVariant。在null-QVariant上调用时,QVariant在调用后不会为null。

const void *data() const返回指向包含对象的指针,该指针为无法写入的通用void*。
T &emplace(Args &&... args)将当前保存在*this中的对象替换为由args构造的T类型的对象....如果*this为非空,则首先销毁先前持有的对象。如果可能的话,这个方法将重用由QVariant分配的内存。返回对新创建的对象的引用。
T &emplace(std::initializer_list<U> list, Args &&... args)此重载是为了支持构造函数采用initializer_list的类型。它的行为等效于非初始值设定项列表重载。
boolisNull() const如果这是 null 的QVariant,则返回true,否则为false。
如果QVariant不包含初始化的值或 null 指针,则将其视为 null。
boolisValid() const如果此QVariant的存储类型不是QMetaType::UnknownType返回true,否则为false。
QMetaTypemetaType() const返回存储在QVariant中的值的QMetaType
voidsetValue(T &&value)

存储value值的副本。如果T是QVariant不支持的类型,则使用QMetaType来存储值。如果QMetaType不处理该类型,将会发生编译错误。

voidsetValue(const QVariant &value)复制value值到此QVariant上。
voidsetValue(QVariant &&value)移动value值到此QVariant上。
voidswap(QVariant &other)将两个QVariant 换。此操作非常快,永远不会失败。
QBitArraytoBitArray() const如果QVariant具有 userType() QMetaType::QBitArray,则以QBitArray 形式返回变量;否则返回一个空bit数组。
booltoBool() const

如果QVariant具有 userType() Bool,则以Bool形式返回变量。

如果QVariant具有userType() QMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::UInt,  QMetaType::ULongLong 并且值 不为0, 或具有QMetaType::QString或 QMetaType::QByteArray并且值不是empty, "0" 或 "false"则返回真,否则返回假。

为精简行文,后续关于userType()和QMetaType::QString形式的“严谨”表述均省略,详见帮助文档。

QByteArraytoByteArray() const如果QVariant具有QByteArrayQString(使用QString::fromUtf8()转换),则以QByteArray形式返回变量;否则返回一个空字节数组。
QChartoChar() const如果QVariant具有QCharIntUInt,则以QChar形式返回变量,否则返回无效QChar
QDatetoDate() const如果QVariant具有QDateQDateTimeQString,则以QDate形式返回变量,如果QString无法解析为格式日期,则返回无效日期。
QDateTimetoDateTime() const

如果QVariant具有QDateTimeQDateQString,则以QDateTime形式返回变量。否则返回无效的日期/时间。 如果类型为QString,则如果字符串无法解析为Qt::ISODate格式的日期/时间,将返回无效的日期/时间。

doubletoDouble(bool *ok = nullptr) const

如果QVariant具有DoubleFloatBoolQByteArrayIntLongLongQStringUIntULongLong 则以双精度形式返回变量,否则返回0.0。如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。

QEasingCurvetoEasingCurve() const

如果QVariant具有QEasingCurve,则以QEasingCurve形式返回变量;否则返回默认缓动曲线。

floattoFloat(bool *ok = nullptr) const

如果QVariant具有DoubleFloatBoolQByteArrayIntLongLongQStringUIntULongLong 则以浮点形式返回变量,否则返回0.0。如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。

QHash<QString, QVariant>toHash() const如果变量具有QMetaType::QVariantHash,则以

QHash<QStringQVariant>形式返回变量。否则返回一个空map。

inttoInt(bool *ok = nullptr) const

如果QVariant具有Int、Bool、QByteArray、QChar、Double、LongLong、QString、UInt或ULongLong则以int返回,否则返回0。 如果ok为非空,并且值可以转换为int,则*ok设置为true,否则*ok设置为false。

警告:如果该值可转换为LongLong,但该值太大而无法用int表示,则产生的算术溢出将不会反映在ok中。一个简单的解决方法是使用QString::toInt()。

QJsonArraytoJsonArray() const如果QVariant具有QJsonArray,则以QJsonArray形式返回变量;否则返回默认构造的QJsonArray
QJsonDocumenttoJsonDocument() const如果QVariant具有QJsonDocument,则以QJsonDocument形式返回变量;否则返回默认构造的QJsonDocument
QJsonObjecttoJsonObject() const如果QVariant具有QJsonObject,则以QJsonObject形式返回变量;否则返回默认构造的QJsonObject
QJsonValuetoJsonValue() const如果QVariant具有如果变量具有QJsonValue,则以QJsonValue形式返回变量;否则返回默认构造的QJsonValue
QLinetoLine() const如果QVariant具有QLine,则以QLine形式返回变量;否则返回无效的QLine
QLineFtoLineF() const

如果QVariant具有 QLineF,则以 QLineF形式返回变量;否则返回无效的 QLineF

QList<QVariant>toList() const

如果QVariant具有QVariantList,则以QVariantList形式返回变量。如果没有, QVariant 将尝试将类型转换为List,然后返回它。对于任何注册了转换为 QVariant 的类型或使用Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE声明为顺序容器的类型,此操作都将成功。如果这些条件都不成立,该函数将返回一个空List。

QLocaletoLocale() const如果QVariant具有QLocale,则以QLocale形式返回变量;否则返回无效的QLocale
qlonglongtoLongLong(bool *ok = nullptr) const

如果QVariant具有long long,Bool,QByteArray,QChar,Double,Int,QString,UInt或ulong long,则以long long int形式返回变量。否则返回0。 如果ok为非空,并且值可以转换为LongLong,则*ok设置为true,否则*ok设置为false。

QMap<QString, QVariant>toMap() const

如果QVariant具有QVariantMap,则以QVariantMap的形式返回变量。如果没有,QVariant将尝试将类型转换为map返回。对于任何注册了到QVariantMap 或使用Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE声明为关联容器的类型,此操作都将成功。如果这些条件都不成立,该函数将返回一个空map。

QModelIndextoModelIndex() const如果QVariant具有QModelIndex ,则以QModelIndex形式返回变量;否则返回默认构造的QModelIndex
QPersistentModelIndextoPersistentModelIndex() const如果QVariant具有QPersistentModelIndex,则以QPersistentModelIndex的形式返回变量;否则返回默认构造的QPersistentModelIndex
QPointtoPoint() const如果QVariant具有如果变量具有 QPointQPointF,则以QPoint形式返回变量;否则返回空的QPoint
QPointFtoPointF() const

如果QVariant具有如果变量具有 QPointQPointF,则以​​​​​​ QPointF形式返回变量;否则返回空的QPointF

qrealtoReal(bool *ok = nullptr) const

如果QVariant具有Double、Float、Bool、QByteArray、Int、LongLong、QString、UInt或ULongLong,则以qreal形式返回变量。否则返回0.0。

如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。

QRecttoRect() const如果QVariant具有QRect,则以QRect形式返回变量;否则返回无效的QRect
QRectFtoRectF() const如果QVariant具有QRect 或 QRectF; ,则以QRectF 形式返回变量;否则返回无效的QRectF 。
QRegularExpressiontoRegularExpression() const如果QVariant具有 QRegularExpression,则以 QRegularExpression的形式返回变量;否则返回空 QRegularExpression
QSizetoSize() const如果QVariant具有如果变量具有QSize,则以QSize形式返回变量;否则返回无效的QSize
QSizeFtoSizeF() const

如果QVariant具有如果变量具有QSizeF ,则以QSizeF形式返回变量;否则返回无效的QSizeF

QStringtoString() const如果QVariant具有以下用户类型,则以QString形式返回变量,包括但不限于:QString、Bool、QByteArray、QChar、QDate、DateTime、Double、Int、LongLong、QStringList、QTime、UInt或ULongLong。 对不支持的Variant调用QVariant::toString()会返回空字符串。
QStringListtoStringList() const如果QVariant具有可转换为QString类型的QStringList、QString或QVariantList,则以QStringList形式返回变量。否则返回一个空List。 
QTimetoTime() const如果QVariant具有QTime、QDateTime或QString,则以QTime形式返回变量,否则返回无效时间。 如果 type()是QString,则当字符串无法解析为Qt::ISODate格式时间时,将返回无效时间。
uinttoUInt(bool *ok = nullptr) const如果QVariant具有

UInt、Bool、QByteArray、QChar、Double、Int、LongLong、QString或ULongLong,则以 unsigned int形式返回变量,否则返回0。 如果ok为非空,并且值可以转换 unsigned int,则*ok设置为true,否则*ok设置为false。

警告:如果该值可转换为ULongLong,但由于太大而无法用无符号int表示,则产生的算术溢出将不会反映在ok中。一个简单的解决方法是使用 QString::toUInt()。

qulonglongtoULongLong(bool *ok = nullptr) const

如果QVariant具有ULongLong、Bool、QByteArray、QChar、Double、Int、LongLong、QString或UInt,则以无符号长整型返回变量;否则返回0。 如果ok为非空,并且值可以转换 int,则*ok设置为true,否则*ok设置为false。

QUrltoUrl() const如果QVariant具有QUrl ,则以QUrl 形式返回变量;否则返回无效的QUrl
QUuidtoUuid() const如果QVariant具有QUuid 、QByteArray或QString,则以QUuid 形式返回变量。否则返回默认构造的QUuid
inttypeId() const
const char *typeName() const返回存储在变量中的类型的名称。返回的字符串描述用于存储数据的C++数据类型。例如:“QFont”、“QString”或“QVariantList”。无效的变量返回0。
intuserType() const返回存储在QVariant中的值的存储类型,它是元类型metaType() 的id。
Tvalue() const/

返回转换为模板类型T的存储值,调用canConvert() 确定类型是否可以转换。如果该值无法转换,将返回默认构造的值 default-constructed value 。 如果QVariant支持T类型,则该函数的行为与 toString(), toInt()等完全相同。

如果QVariant包含从QObject派生的类型的指针,则T可以是任何QObject类型。如果存储在QVariant中的指针可以被qobject_cast 转换为T,则返回该结果,否则返回nullptr。

请注意,这只适用于使用Q_OBJECT 宏的QObject子类。 如果QVariant包含一个顺序容器并且T是QVariantList,则该容器的元素将被转换为q variant并作为QVariantList返回。

Tview()返回存储值的模板类型T的可变视图。调用canView() 来确定是否支持这样的视图。如果无法创建这样的视图,则返回转换为模板类型的存储值,调用canConvert() 来确定类型是否可以转换。如果该值既不能查看也不能转换,将返回默认构造的值 default-constructed value
QVariant &operator=(const QVariant &variant)将变量variant的值赋给此变量。
QVariant &operator=(QVariant &&other)移动分配(move-assigns)other给此QVariant实例。

【静态公有成员】

QPartialOrderingcompare(const QVariant &lhs, const QVariant &rhs)

比较左侧和右侧的物体以进行排序。 如果不支持比较或值无序,则返回QPartialOrdering::Unordered。否则,如果lhs小于、等于或大于rhs,则分别返回 QPartialOrdering::LessQPartialOrdering::Equivalent or QPartialOrdering::Greater。 如果变量包含具有不同元类型的数据,则这些值被视为无序的,除非它们都是数值或指针类型,在这种情况下将使用常规的数值或指针比较规则。

注意:如果进行了数值比较并且至少有一个值是NaN,则返回 QPartialOrdering::Unordered

如果两个变量包含相同元类型的数据,该方法将使用QMetaType::compare方法来确定两个变量的排序,这也表明它无法在两个值之间建立排序。

QVariantfromStdVariant(const std::variant<Types...> &value)
QVariantfromStdVariant(std::variant<Types...> &&value)

返回一个QVariant,其类型和值为活动变量的值value。如果活动类型是std::monostate,则返回默认的QVariant

注意:使用这种方法,您不需要将变量注册为Qt元类型,因为std::variant在存储之前已被解析。但是,应该注册组件类型。

QVariantfromValue(const T &value)
QVariantfromValue(T &&value)

返回一个包含value值副本的QVariant,行为与setValue()完全相同。


QVariantHash
QVariantList
QVariantMap
T &get(QVariant &v)
const T &get(const QVariant &v)
T &&get(QVariant &&v)
const T &&get(const QVariant &&v)
T *get_if(QVariant *v)
const T *get_if(const QVariant *v)
Tqvariant_cast(const QVariant &value)
booloperator!=(const QVariant &v1, const QVariant &v2)
QDataStream &operator<<(QDataStream &s, const QVariant &p)
booloperator==(const QVariant &v1, const QVariant &v2)
QDataStream &operator>>(QDataStream &s, QVariant &p)

<<< 返回根页面

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值