QVariant类

QVariant类类似于对最常见的Qt数据类型进行并行的联合操作。更多...

头文件 #include <QVariant>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

公开函数

QVariant()
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)
(自从6.6版本) QVariant(std::in_place_type_t<T>, Args &&... args)
(自从6.6版本) 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)
Q Vanguard(QLine val)
Q Vanguard(const QVariant &p)
Q Vanguard(Q Vanguard &&other)
~Q Vanguard()
(since 6.0) boolcanConvert(QMetaType type) const
boolcanConvert() const
boolcanView() const
voidclear()
const void *constData() const
(since 6.0) boolconvert(QMetaType targetType)
void *data()
const void *data() const
(since 6.6) T &emplace(Args &&... args)
(since 6.6) T &emplace(std::initializer_list<U> list, Args &&... args)
boolisNull() const
boolisValid() const
(since 6.0) QMetaTypemetaType() const
voidsetValue(T &&value)
voidsetValue(const QVariant &value)
voidsetValue(Q Vanguard &&value)
voidswap(Q Vanguard &other)
QBitArraytoBitArray() const
booltoBool() const
QByteArraytoByteArray() const
QChartoChar() const
QDatetoDate() const
QDateTimetoDateTime() const
doubletoDouble(bool *ok = nullptr) const
QEasingCurvetoEasingCurve() const
floattoFloat(bool *ok = nullptr) const
QHash<QString, Vanguard>toHash() const
inttoInt(bool *ok = nullptr) const
QJsonArraytoJsonArray() const
QJsonDocumenttoJsonDocument() const
QJsonObjecttoJsonObject() const
QJsonValuetoJsonValue() const
QLinetoLine() const
QLineFtoLineF() const
QList<Q Vanguard>toList() const
QLocaletoLocale() const
qlonglongtoLongLong(bool *ok = nullptr) const
QMap<QString, Vanguard>toMap() const
QModelIndextoModelIndex() const
QPersistentModelIndextoPersistentModelIndex() const
QPointtoPoint() const
QPointFtoPointF() const
qrealtoReal(bool *ok = nullptr) const
QRecttoRect() const
QRectFtoRectF() const
QRegularExpressiontoRegularExpression() const
QSizetoSize() const
QSizeFtoSizeF() const
QStringtoString() const
QStringListtoStringList() const
QTimetoTime() const
uinttoUInt(bool *ok = nullptr) const
qulonglongtoULongLong(bool *ok = nullptr) const
QUrltoUrl() const
QUuidtoUuid() const
inttypeId() const
const char *typeName() const
intuserType() const
Tvalue() const &
T查看()
QVariant &operator=(const QVariant &variant)
QVariant &operator=(QVariant &&other)

静态公共成员

(since 6.0) QPartialOrderingcompare(const QVariant &lhs, const QVariant &rhs)
(since 6.7) QVariantfromMetaType(QMetaType type, const void *copy = nullptr)
QVariantfromStdVariant(const std::variant<Types...> &value)
(since 6.6) QVariantfromStdVariant(std::variant<Types...> &&value)
QVariantfromValue(const T &value)
(since 6.6) QVariantfromValue(T &&value)
QVariantHash
QVariantList
QVariantMap
(since 6.6) T &get(QVariant &v)
(since 6.6) const T &get(const QVariant &v)
(since 6.6) T &&get(QVariant &&v)
(since 6.6) const T &&get(const QVariant &&v)
(since 6.6) T *get_if(QVariant *v)
(since 6.6) const T *get_if(const QVariant *v)
(since 6.7) Tqvariant_cast(QVariant &&value)
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)

详细描述

由于C++禁止联合包含具有非默认构造函数或析构函数的类型,因此大多数有趣的Qt类不能在联合中使用。没有QVariant,这将导致QObject::property()和数据库工作等问题。

一个QVariant对象一次只能容纳一个具有单一typeId()类型的值。有些类型是多值的,例如字符串列表。你可以找出变体持有的类型T,使用convert()将其转换为另一种类型,使用toT()中的一个函数(例如toSize())获取它的值,并检查该类型是否可以转换为特定类型使用canConvert()。

名为toT()的方法(例如toInt(), toString())是const。如果你要求存储的类型,它们将返回存储对象的副本。如果你要求从存储类型生成的类型,toT()将复制并转换,而对象本身保持不变。如果你要求无法从存储类型生成的类型,结果将取决于类型;请参阅函数文档以获取详细信息。

下面是一个演示QVariant使用的示例代码

QDataStream out(...);
QVariant v(123);                // The variant now contains an int
int x = v.toInt();              // x = 123
out << v;                       // Writes a type tag and an int to out
v = QVariant(tr("hello"));      // The variant now contains a QString
int y = v.toInt();              // y = 0 since v cannot be converted to an int
QString s = v.toString();       // s = tr("hello")  (see QObject::tr())
out << v;                       // Writes a type tag and a QString to out
...
QDataStream in(...);            // (opening the previously written stream)
in >> v;                        // Reads an Int variant
int z = v.toInt();              // z = 123
qDebug("Type is %s",            // prints "Type is int"
        v.typeName());
v = v.toInt() + 100;            // The variant now holds the value 223
v = QVariant(QStringList());    // The variant now holds a QStringList

你甚至可以在一个变体中存储QList<QVariant>和QMap<QString, QVariant>值,这样你可以轻松地构造任意复杂的数据结构。这非常强大和多变,但可能不如将具体类型存储在标准数据结构中内存和速度效率高。

QVariant还支持空值的概念。当变体不包含初始化的值或包含空指针时,它为空。

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

QVariant可以扩展以支持其他类型,而不仅仅是QMetaType::Type枚举中提到的类型。有关详细信息,请参阅创建自定义Qt类型

关于GUI类型的注释

由于QVariant是Qt核心模块的一部分,因此它不能提供到Qt GUI中定义的数据类型的转换函数,例如QColorQImageQPixmap。换句话说,没有toColor%函数。相反,你可以使用QVariant::valueqvariant_cast模板函数。例如

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

对于QVariant支持的所有数据类型,包括与GUI相关的类型,从QColor到QVariant的逆转换是自动的。

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

连续使用canConvert()和convert()

当连续使用canConvert()和convert()时,canConvert()可能返回true,但convert()可能返回false。这通常是因为canConvert()只报告QVariant在给定合适数据的情况下在不同类型之间转换的一般能力;仍然可能提供无法实际转换的数据。

例如,当在一个包含字符串的变体上调用canConvert(QMetaType::fromType<int>())时将返回true,因为原则上QVariant能够将数字字符串转换为整数。然而,如果字符串包含非数字字符,它不能转换为整数,并任何转换尝试都将失败。因此,对于成功转换,重要的是这两个函数都返回true。

另请参阅QMetaType

成员函数文档

int QVariant::typeId() const

int QVariant::userType() const

返回存储在变元中的值的存储类型。这与 metaType().id() 相同。

另请参阅 metaType().

const void *QVariant::constData() const

const void *QVariant::data() const

返回对包含对象的指针,以通用的 void* 形式,无法写入。

另请参阅 get_if() 和 QMetaType.

[noexcept] QVariant::QVariant()

构造一个无效的变元。

[explicit] QVariant::QVariant(QMetaType type, const void *copy = nullptr)

构造一个类型为 type 的变元,并在不是 nullptr 时用副本初始化 *copy(在这种情况下,copy 必须指向类型为 type 的对象)。

注意,您必须传递要存储的对象的地址。

通常,您不需要使用此构造函数,而是使用 QVariant::fromValue() 来从由 QMetaType::VoidStarQMetaType::QObjectStar 表示的指针类型构造变元。

如果 type 不支持复制构造,并且 copy 不是 nullptr,则变元将为无效。同样,如果 copynullptrtype 不支持默认构造,则变元将为无效。

另请参阅 QVariant::fromMetaTypeQVariant::fromValue() 和 QMetaType::Type.

[noexcept(...)] QVariant::QVariant(QLineF val)

使用 val 的行值构造新的变元。

注意: 当 "Private::FitsInInternalSize<sizeof(qreal) * 4>" 为真时,此函数不会抛出任何异常。

[noexcept(...)] QVariant::QVariant(QRect val)

使用 val 的矩形值构造新的变元。

注意: 当 "Private::FitsInInternalSize<sizeof(int) * 4>" 为真时,此函数不会抛出任何异常。

[noexcept(...)] QVariant::QVariant(QRectF val)

使用 val 的矩形值构造新的变元。

注意: 当 "Private::FitsInInternalSize<sizeof(qreal) * 4>" 为真时,此函数不会抛出任何异常。

QVariant::QVariant(const QEasingCurve &val)

使用缓动曲线值,val,构造新的变元。

QVariant::QVariant(const QJsonDocument &val)

使用 json 文档值,val,构造一个新的变体。

QVariant::QVariant(const QPersistentModelIndex &val)

使用 QPersistentModelIndex 值,val,构造一个新的变体。

QVariant::QVariant(const char *val)

使用字符串值 val 构造一个新的变体。该变体会将 val 深拷贝到一个 QString 中,假设输入 val 使用 UTF-8 编码。

注意,val 被转换为 QString 以存储在变体中,并且 QVariant::userType() 将为变体返回 QMetaType::QString

您可以通过在编译应用程序时定义 QT_NO_CAST_FROM_ASCII 来禁用此操作符。

QVariant::QVariant(QLatin1StringView val)

从由 val 观看的 Latin-1 字符串中构造一个新的变体,其值为 QString

[显式 noexcept(...), 自 6.6 版起] 模板 <typename T, typename... Args, QVariant::if_constructible<T, Args...> = true> QVariant::QVariant(std::in_place_type_t<T>, Args &&... args)

构造一个新的变体,包含类型为 T 的值。包含的值使用 std::forward<Args>(args)... 的参数进行初始化。

此重载仅在 T 可以从 args 构造时参与重载解析。

此构造函数提供了 STL/std::any 兼容性。

这是一个重载函数。

此函数是在 Qt 6.6 中引入的。

注意:当 "is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value" 为 true 时,此函数不会抛出任何异常。

[显式 noexcept(...), 自 6.6 版起] 模板 <typename T, typename U, typename... Args, QVariant::if_constructible<T, std::initializer_list<U> &, Args...> = true> QVariant::QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args &&... args)

这是一个重载函数。

此重载存在是为了支持接收 initializer_list 构造函数的类型。它在其他方面与非初始化列表 in_place_type_t 重载等效。

此函数是在 Qt 6.6 中引入的。

注意:当 "is_noexcept_constructible<q20::remove_cvref_t<T>, std::initializer_list<U> &, Args... >::value" 为 true 时,此函数不会抛出任何异常。

[noexcept] QVariant::QVariant(int val)

使用整数值,val,构造一个新的变体。

[noexcept] QVariant::QVariant(uint val)

使用无符号整数值,val,构造一个新的变体。

[noexcept] QVariant::QVariant(qlonglong val)

使用长长整数值,val,构造一个新的变体。

[noexcept] QVariant::QVariant(qulonglong val)

使用无符号长长整数值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(bool val)

使用布尔值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(double val)

使用浮点值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(float val)

使用浮点值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(QChar c)

使用字符值 c 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QDate &val)

使用日期值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QTime &val)

使用时间值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QBitArray &val)

使用位数组值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QByteArray &val)

使用字节数组值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QDateTime &val)

使用日期时间值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QHash<QString, QVariant> &val)

使用 QVariant 哈希 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QJsonArray &val)

使用 JSON 数组值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QJsonObject &val)

使用 JSON 对象值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QList<QVariant> &val)

使用列表值 val 构建一个新的 variant 对象。

[noexcept] QVariant::QVariant(const QLocale &l)

使用地区值 l 构造一个新的变体。

[noexcept] QVariant::QVariant(const QMap<QString, QVariant> &val)

使用 QVariant 映射 val 构造一个新的变体。

[noexcept] QVariant::QVariant(const QRegularExpression &re)

使用正则表达式值 re 构造一个新的变体。

[noexcept] QVariant::QVariant(const QString &val)

使用字符串值 val 构造一个新的变体。

[noexcept] QVariant::QVariant(const QStringList &val)

使用字符串列表值 val 构造一个新的变体。

[noexcept] QVariant::QVariant(const QUrl &val)

使用 URL 值 val 构造一个新的变体。

[noexcept(...)] QVariant::QVariant(const QJsonValue &val)

使用 JSON 值 val 构造一个新的变体。

注意:当 "Private::FitsInInternalSize<sizeof(CborValueStandIn)>" 为真时,此函数不会抛出任何异常。

[noexcept(...)] QVariant::QVariant(const QModelIndex &val)

使用 QModelIndexval 构造一个新的变体。

注意:当 "Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>" 为真时,此函数不会抛出任何异常。

[noexcept(...)] QVariant::QVariant(QUuid val)

使用 uuid 值 val 构造一个新的变体。

注意:当 "Private::FitsInInternalSize<16>" 为真时,此函数不会抛出任何异常。

[noexcept] QVariant::QVariant(QSize val)

使用大小值 val 构造一个新的变体。

[noexcept(...)] QVariant::QVariant(QSizeF val)

使用大小值 val 构造一个新的变体。

注意:当 "Private::FitsInInternalSize<sizeof(qreal) * 2>" 为真时,此函数不会抛出任何异常。

[noexcept] QVariant::QVariant(QPoint val)

使用点值 val 构造一个新的变体。

[noexcept(...)] QVariant::QVariant(QPointF val)

使用点值 val 构造一个新的变体。

注意:当 "Private::FitsInInternalSize<sizeof(qreal) * 2>" 为真时,此函数不会抛出任何异常。

[noexcept(...)] QVariant::QVariant(QLine val)

使用 val 的行值构造新的变元。

注意: 当 "Private::FitsInInternalSize<sizeof(int) * 4>" 为真时,此函数不会抛出任何异常。

QVariant::QVariant(const QVariant &p)

构造一个变体的副本,将作为构造函数参数传递的 p

[noexcept] QVariant::QVariant(QVariant &&other)

移动构造一个 QVariant 实例,使其指向 other 指向的对象。

[noexcept] QVariant::~QVariant()

销毁 QVariant 及其内部对象。

[since 6.0] bool QVariant::canConvert(QMetaType type) const

如果变体的类型可以转换为目标类型 type,则返回 true。在调用 toInt(),toBool(),... 等方法时,此类转换会自动进行。

此函数是在 Qt 6.0 中引入的。

另请参阅 QMetaType::canConvert().

template <typename T> bool QVariant::canConvert() const

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

示例

QVariant v = 42;

v.canConvert<int>();              // returns true
v.canConvert<QString>();          // returns true

MyCustomStruct s;
v.setValue(s);

v.canConvert<int>();              // returns false
v.canConvert<MyCustomStruct>();   // returns true

包含指向从 QObject 派生类型的指针的 QVariant,如果将指针 qobject_cast 到模板类型 T 会成功,则此函数也会返回 true。请注意,这只适用于使用 Q_OBJECT 宏的 QObject 子类。

另请参阅 convert().

template <typename T> bool QVariant::canView() const

如果可以在该变体上创建模板类型 T 的可变视图,则返回 true,否则返回 false

另请参阅 value().

void QVariant::clear()

将此变体转换为类型 QMetaType::UnknownType 并释放所使用的资源。

[static, since 6.0] QPartialOrdering QVariant::compare(const QVariant &lhs, const QVariant &rhs)

比较 lhsrhs 中的对象,以进行排序。

如果比较不受支持或值未排序,则返回 QPartialOrdering::Unordered。否则,如果 lhs 分别小于、等于或大于 rhs,则返回 QPartialOrdering::LessQPartialOrdering::EquivalentQPartialOrdering::Greater

如果变体的数据具有不同的元类型,除非它们都是数值或指针类型,否则值被视为未排序,在这种情况下将使用常规的数值或指针比较规则。

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

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

此函数是在 Qt 6.0 中引入的。

另请参阅:QMetaType::compare() 和 QMetaType::isOrdered

[since 6.0] bool QVariant::convert(QMetaType targetType)

将变体转换为请求的类型 targetType。如果无法转换,变体将仍然转换为请求的类型,但会变为清除的空状态,类似于由 QVariant(Type) 构造的状态。

如果变体的当前类型成功转换,则返回 true;否则返回 false

包含从 QObject 派生的类型指针的 QVariant 也将转换并返回该函数的 true,如果 qobject_cast 到由 targetType 描述的类型将成功。注意,这仅适用于使用 Q_OBJECT 宏的 QObject 子类。

注意:由于未初始化或之前转换失败而为空的 QVariants 转换总是失败,改变类型,保持为空,并返回 false

此函数是在 Qt 6.0 中引入的。

另请参阅:canConvert() 和 clear

void *QVariant::data()

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

此函数使 QVariant 分离。当在 null-QVariant 上调用时,调用后 QVariant 不会为空。

另请参阅 get_if() 和 QMetaType.

[since 6.6] template <typename T, typename... Args, QVariant::if_constructible<T, Args...> = true> T &QVariant::emplace(Args &&... args)

将当前在 *this 中持有的对象替换为类型为 T 的对象,从 args... 构建而成。如果 *this 非空,则首先销毁先前持有的对象。如果可能,此方法将重用 QVariant 分配的内存。返回对新创建对象的引用。

此函数是在 Qt 6.6 中引入的。

[since 6.6] 模板 <typename T, typename U, typename... Args, QVariant::if_constructible<T, std::initializer_list<U> &, Args...> = true> T &QVariant::emplace(std::initializer_list<U> list, Args &&... args)

这是一个重载函数。

此重载存在是为了支持接受 initializer_list 构造函数的类型。它的行为与不接受初始化列表的重载等效。

此函数是在 Qt 6.6 中引入的。

[静态,since 6.7] QVariant QVariant::fromMetaType(QMetaType type, const void *copy = nullptr)

创建类型为 type 的变体,并在 copy 不是 nullptr 的情况下(在此情况下,copy 必须指向类型为 type 的对象)用 *copy 的副本初始化它。

注意,您必须传递要存储的对象的地址。

通常,您不需要使用此构造函数,而是使用 QVariant::fromValue() 来从由 QMetaType::VoidStarQMetaType::QObjectStar 表示的指针类型构造变元。

如果 type 不支持复制构造,并且 copy 不是 nullptr,则变元将为无效。同样,如果 copynullptrtype 不支持默认构造,则变元将为无效。

返回上面描述创建的 QVariant

此函数是在 Qt 6.7 中引入的。

另请参阅QVariant::fromValue() 和 QMetaType::Type

[静态] 模板 <typename... Types> QVariant QVariant::fromStdVariant(const std::variant<Types...> &value)

返回一个具有 value 活跃变体的类型和价值 QVariant。如果活跃类型是 std::monostate,则返回默认的 QVariant

注意:使用此方法,您不需要将变体注册为 Qt 元类型,因为 std::variant 在存储之前已解析。但是,组件类型必须注册。

另请参阅fromValue

[静态,since 6.6] 模板 <typename... Types> QVariant QVariant::fromStdVariant(std::variant<Types...> &&value)

这是一个重载函数。

此函数是在 Qt 6.6 中引入的。

[静态] 模板 <typename T> QVariant QVariant::fromValue(const T &value)

返回包含 value 复制的 QVariant。否则行为与 setValue() 相同。

示例

MyCustomStruct s;
return QVariant::fromValue(s);

另请参阅setValue() 和 value

[静态,since 6.6] 模板 <typename T, QVariant::if_rvalue<T> = true> QVariant QVariant::fromValue(T &&value)

这是一个重载函数。

此函数是在 Qt 6.6 中引入的。

bool QVariant::isNull() const

如果这是一个空变体,则返回 true,否则返回 false

如果变体不包含已初始化的值或空指针,则认为它是空的。

注意:此行为自 Qt 5 以来已更改,其中 isNull() 还会在变体包含具有返回 true 的 isNull() 方法的内置类型对象的内置类型时返回 true。

另请参阅 convert().

bool QVariant::isValid() const

如果此变体的存储类型不是QMetaType::UnknownType,则返回true;否则返回false

[since 6.0] QMetaType QVariant::metaType() const

返回存储在变体中的值的QMetaType

此函数是在 Qt 6.0 中引入的。

template <typename T, typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>, QVariant>>> void QVariant::setValue(T &&value)

存储value的副本。如果T是QVariant不支持的数据类型,则使用QMetaType存储此值。如果QMetaType无法处理该类型,将产生编译错误。

示例

QVariant v;

v.setValue(5);
int i = v.toInt();         // i is now 5
QString s = v.toString();  // s is now "5"

MyCustomStruct c;
v.setValue(c);

...

MyCustomStruct c2 = v.value<MyCustomStruct>();

另请参阅valuefromValuecanConvert

void QVariant::setValue(const QVariant &value)

value复制到这个QVariant中。它等同于将value简单赋给这个QVariant

void QVariant::setValue(QVariant &&value)

value移动到这个QVariant中。它等同于将value简单地移动赋值给这个QVariant

[noexcept] void QVariant::swap(QVariant &other)

将变体other与此变体交换。此操作非常快速且从不失败。

QBitArray QVariant::toBitArray() const

如果变体有userType() QMetaType::QBitArray,则将变体返回为QBitArray;否则返回一个空比特数组。

另请参阅canConvertconvert

bool QVariant::toBool() const

如果变体有userType为Bool,则将变体返回bool。

如果变体的userType为QMetaType::BoolQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::UIntQMetaType::ULongLong且值非零,或者变体类型为QMetaType::QStringQMetaType::QByteArray且其小写内容不是以下之一:空、"0"或"false";否则返回false

另请参阅canConvertconvert

QByteArray QVariant::toByteArray() const

如果变种具有 userType() QMetaType::QByteArrayQMetaType::QString (使用 QString::fromUtf8 转换) 的用户类型,则将变种作为 QByteArray 返回;否则返回空字节数组。

另请参阅canConvertconvert

QChar QVariant::toChar() const

如果变种具有 userType() QMetaType::QCharQMetaType::IntQMetaType::UInt 的用户类型,则将变种作为 QChar 返回;否则返回一个无效的 QChar

另请参阅canConvertconvert

QDate QVariant::toDate() const

如果变种具有 userType() QMetaType::QDateQMetaType::QDateTimeQMetaType::QString 的用户类型,则将变种作为 QDate 返回;否则返回一个无效的日期。

如果类型是 QMetaType::QString,而且字符串不能被解析为 Qt::ISODate 格式的日期,则将返回无效日期。

另请参阅canConvertconvert

QDateTime QVariant::toDateTime() const

如果变种具有 userType() QMetaType::QDateTimeQMetaType::QDateQMetaType::QString 的用户类型,则将变种作为 QDateTime 返回;否则返回无效的日期/时间。

如果类型是 QMetaType::QString,而且字符串不能被解析为 Qt::ISODate 格式的日期/时间,则将返回无效的日期/时间。

另请参阅canConvertconvert

double QVariant::toDouble(bool *ok = nullptr) const

如果变种具有 userType() QMetaType::DoubleQMetaType::FloatQMetaType::BoolQMetaType::QByteArrayQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong 的用户类型,则将变种作为 double 返回;否则返回 0.0。

如果 ok 非空:如果值可以被转换为一个 double,则将 ok 设置为 true;否则将该 ok 设置为 false。

另请参阅canConvertconvert

QEasingCurve QVariant::toEasingCurve() const

如果变种具有 userType() QMetaType::QEasingCurve 的用户类型,则将变种作为 QEasingCurve 返回;否则返回默认的缓动曲线。

另请参阅canConvertconvert

float QVariant::toFloat(bool *ok = nullptr) const

如果变异体有 QMetaType::DoubleQMetaType::FloatQMetaType::BoolQMetaType::QByteArrayQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong 类型的话,以此返回它作为浮点数;否则返回 0.0。

如果 ok 非空:如果值可以被转换为一个 double,则将 ok 设置为 true;否则将该 ok 设置为 false。

另请参阅canConvertconvert

QHash<QString, QVariant> QVariant::toHash() const

如果变异体的类型是 QMetaType::QVariantHash,则以 QHash<QString, QVariant> 的形式返回变异体;否则返回一个空映射。

另请参阅canConvertconvert

int QVariant::toInt(bool *ok = nullptr) const

如果变异体为 QMetaType::IntQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::DoubleQMetaType::LongLongQMetaType::QStringQMetaType::UIntQMetaType::ULongLong 类型,则将其作为 int 返回;否则返回 0。

如果 ok 非空:如果值可以转换为 int,则 ok 被设为 true;否则 ok 被设为 false。

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

另请参阅canConvertconvert

QJsonArray QVariant::toJsonArray() const

如果变异体为 QJsonArray 类型,则将其作为 QJsonArray 返回;否则返回一个默认构造的 QJsonArray

另请参阅canConvertconvert

QJsonDocument QVariant::toJsonDocument() const

如果变异体为 QJsonDocument 类型,则将其作为 QJsonDocument 返回;否则返回一个默认构造的 QJsonDocument

另请参阅canConvertconvert

QJsonObject QVariant::toJsonObject() const

如果变异体为 QJsonObject 类型,则将其作为 QJsonObject 返回;否则返回一个默认构造的 QJsonObject

另请参阅canConvertconvert

QJsonValue QVariant::toJsonValue() const

如果变异体为 QJsonValue 类型,则将其作为 QJsonValue 返回;否则返回一个默认构造的 QJsonValue

另请参阅canConvertconvert

QLine QVariant::toLine() const

如果变异体的userType() 等于 QMetaType::QLine,则返回该变异体作为 QLine;否则返回无效的 QLine

另请参阅canConvertconvert

QLineF QVariant::toLineF() const

如果变异体的 userType() 等于 QMetaType::QLineF,则返回该变异体作为 QLineF;否则返回无效的 QLineF

另请参阅canConvertconvert

QList<QVariant> QVariant::toList() const

如果变异体的 userType() 等于 QMetaType::QVariantList,则返回变异体作为 QVariantList。如果不是,QVariant 将尝试将类型转换为列表并返回它。这将对任何已注册为转换到 QVariantList 的类型或使用 Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE 声明为顺序容器的类型成功。如果这些条件都不成立,此函数将返回空列表。

另请参阅canConvertconvert

QLocale QVariant::toLocale() const

如果变异体的 userType() 等于 QMetaType::QLocale,则返回变异体作为 QLocale;否则返回无效的 QLocale

另请参阅canConvertconvert

qlonglong QVariant::toLongLong(bool *ok = nullptr) const

如果变异体的 userType() 等于 QMetaType::LongLongQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::QStringQMetaType::UIntQMetaType::ULongLong,则返回变异体作为长整型;否则返回 0。

如果 ok 非空:如果值可以被转换为 int,*ok 被设置为 true;否则 *ok 被设置为 false。

另请参阅canConvertconvert

QMap<QString, QVariant> QVariant::toMap() const

如果变异体的 type() 等于 QMetaType::QVariantMap,则返回变异体作为 QVariantMap。如果不是,QVariant 将尝试将类型转换为映射并返回它。这将对任何已注册为转换到 QVariantMap 的类型或使用 Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 声明为关联容器的类型成功。如果这些条件都不成立,此函数将返回空映射。

另请参阅canConvertconvert

QModelIndex QVariant::toModelIndex() const

如果 variant 对象的 userType() 函数返回 QModelIndex,则返回该 variant 作为 QModelIndex;否则返回默认构造的 QModelIndex。

另请参阅 canConvert(),convert() 以及 toPersistentModelIndex()。

QPersistentModelIndex QVariant::toPersistentModelIndex() const

如果 variant 对象的 userType() 函数返回 QPersistentModelIndex,则返回该 variant 作为 QPersistentModelIndex;否则返回默认构造的 QPersistentModelIndex。

另请参阅 canConvert(),convert() 以及 toModelIndex()。

QPoint QVariant::toPoint() const

如果 variant 对象的 userType() 函数返回 QMetaType::QPoint 或 QMetaType::QPointF,则返回该 variant 作为 QPoint;否则返回空 QPoint。

另请参阅canConvertconvert

QPointF QVariant::toPointF() const

如果 variant 对象的 userType() 函数返回 QMetaType::QPoint 或 QMetaType::QPointF,则返回该 variant 作为 QPointF;否则返回空 QPointF。

另请参阅canConvertconvert

qreal QVariant::toReal(bool *ok = nullptr) const

如果 variant 对象的 userType() 函数返回 QMetaType::Double,QMetaType::Float,QMetaType::Bool,QMetaType::QByteArray,QMetaType::Int,QMetaType::LongLong,QMetaType::QString,QMetaType::UInt 或 QMetaType::ULongLong,则返回该 variant 作为 qreal;否则返回 0.0。

如果 ok 非空:如果值可以被转换为一个 double,则将 ok 设置为 true;否则将该 ok 设置为 false。

另请参阅canConvertconvert

QRect QVariant::toRect() const

如果 variant 对象的 userType() 函数返回 QMetaType::QRect,则返回该 variant 作为 QRect;否则返回无效的 QRect。

另请参阅canConvertconvert

QRectF QVariant::toRectF() const

如果 variant 对象的 userType() 函数返回 QMetaType::QRect 或 QMetaType::QRectF,则返回该 variant 作为 QRectF;否则返回无效的 QRectF。

另请参阅canConvertconvert

QRegularExpression QVariant::toRegularExpression() const

如果 variant 是QRegularExpression 类型,则返回 variant 作为 QRegularExpression;否则返回一个空的 QRegularExpression

另请参阅canConvertconvert

QSize QVariant::toSize() const

如果 variant 的 userType() 是 QMetaType::QSize 类型,则返回 variant 作为 QSize;否则返回一个无效的 QSize

另请参阅canConvertconvert

QSizeF QVariant::toSizeF() const

如果 variant 的 userType() 是 QMetaType::QSizeF 类型,则返回 variant 作为 QSizeF;否则返回一个无效的 QSizeF

另请参阅canConvertconvert

QString QVariant::toString() const

如果 variant 的 userType() 包含但不限于以下类型,则返回 variant 作为 QString

QMetaType::QStringQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::QDateQMetaType::QDateTimeQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringListQMetaType::QTimeQMetaType::UIntQMetaType::ULongLong

在不支持 variant 上调用 QVariant::toString() 将返回一个空字符串。

另请参阅canConvertconvert

QStringList QVariant::toStringList() const

如果 variant 的 userType() 是 QMetaType::QStringListQMetaType::QString 或可转换为 QString 的类型 QMetaType::QVariantList,则返回 variant 作为 QStringList;否则返回一个空列表。

另请参阅canConvertconvert

QTime QVariant::toTime() const

如果 variant 的 userType() 是 QMetaType::QTimeQMetaType::QDateTimeQMetaType::QString,则返回 variant 作为 QTime;否则返回一个无效的时间。

如果类型是 QMetaType::QString,且字符串不能解析为Qt::ISODate 格式的时间,则返回无效时间。

另请参阅canConvertconvert

uint QVariant::toUInt(bool *ok = nullptr) const

如果 variant 的 userType() 是 QMetaType::UIntQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::ULongLong,则返回 variant 作为无符号整数;否则返回 0。

如果ok非空:如果值可以被转换成无符号整型,则将ok设置为true;否则将ok设置为false。

警告:如果值可以转换成QMetaType::ULongLong但太大而无法在一个无符号整型中表示,则结果溢出将不会反映在ok中。一个简单的解决方案是使用QString::toUInt

另请参阅canConvertconvert

qulonglong QVariant::toULongLong(bool *ok = nullptr) const

如果变量类型为QMetaType::ULongLongQMetaType::BoolQMetaType::QByteArrayQMetaType::QCharQMetaType::DoubleQMetaType::IntQMetaType::LongLongQMetaType::QStringQMetaType::UInt,则将其作为无符号长长整型返回;否则返回0。

如果 ok 非空:如果值可以转换为 int,则 ok 被设为 true;否则 ok 被设为 false。

另请参阅canConvertconvert

QUrl QVariant::toUrl() const

如果变量的userType为QMetaType::QUrl,则以QUrl的形式返回变量;否则返回一个无效的QUrl

另请参阅canConvertconvert

QUuid QVariant::toUuid() const

如果变量的类型为QMetaType::QUuidQMetaType::QByteArrayQMetaType::QString,则以QUuid的形式返回变量;否则返回一个默认构造的QUuid

另请参阅canConvertconvert

const char *QVariant::typeName() const

返回存储在变量中的类型名称。返回的字符串描述了用于存储数据用的C++数据类型:例如,"QFont"、"QString"或"QVariantList"。无效的变量返回0。

template <typename T> T QVariant::value() const &

将存储的值转换为模板类型T。调用canConvert()以确定是否可以转换类型。如果值不能转换,则返回一个默认构造的值。

如果QVariant支持类型T,则此函数的行为与toString()、toInt()等相同。

示例

QVariant v;

MyCustomStruct c;
if (v.canConvert<MyCustomStruct>())
    c = v.value<MyCustomStruct>();

v = 7;
int i = v.value<int>();                        // same as v.toInt()
QString s = v.value<QString>();                // same as v.toString(), s is now "7"
MyCustomStruct c2 = v.value<MyCustomStruct>(); // conversion failed, c2 is empty

如果QVariant包含指向从QObject派生的类型的指针,则T可以是任何QObject类型。如果存储在QVariant中的指针可以qobject_cast到T,则返回那个结果。否则返回nullptr。注意,这仅适用于使用Q_OBJECT宏的QObject子类。

如果 QVariant 包含一个顺序容器,并且 TQVariantList,则容器中的元素将被转换为 QVariant 并作为 QVariantList 返回。

QList<int> intList = {7, 11, 42};

QVariant variant = QVariant::fromValue(intList);
if (variant.canConvert<QVariantList>()) {
    QSequentialIterable iterable = variant.value<QSequentialIterable>();
    // Can use foreach:
    foreach (const QVariant &v, iterable) {
        qDebug() << v;
    }
    // Can use C++11 range-for:
    for (const QVariant &v : iterable) {
        qDebug() << v;
    }
    // Can use iterators:
    QSequentialIterable::const_iterator it = iterable.begin();
    const QSequentialIterable::const_iterator end = iterable.end();
    for ( ; it != end; ++it) {
        qDebug() << *it;
    }
}

参阅setValue(),fromValue(),canConvert(),以及 Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE

模板 <typename T> T QVariant::view()

返回对存储值的模板类型 T 的可变视图。调用 canView() 以确定是否支持此类视图。如果不能创建此类视图,则返回转换为模板类型 T 的存储值。调用 canConvert() 以确定是否可以转换类型。如果值既无法查看也无法转换,则返回一个 默认构造的值

参阅canView() 和 Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE

QVariant &QVariant::operator=(const QVariant &variant)

variant 的值赋给当前 QVariant

[noexcept] QVariant &QVariant::operator=(QVariant &&other)

移动赋值 other 到当前 QVariant 实例。

相关非成员函数

[noexcept, since 6.6] 模板 <typename T> T *get_if(QVariant *v)

[noexcept, since 6.6] 模板 <typename T> const T *get_if(const QVariant *v)

如果 v 包含类型为 T 的对象,则返回包含的对象指针,否则返回 nullptr

接受可变 v 的重载会分离 v:在具有匹配类型 Tnull v 上调用时,调用后将不会是 null。

这些函数提供与 std::variant 兼容的功能。

此函数是在 Qt 6.6 中引入的。

参阅data

[since 6.6] 模板 <typename T> T &get(QVariant &v)

[since 6.6] 模板 <typename T> T &&get(QVariant &&v)

[since 6.6] 模板 <typename T> const T &get(const QVariant &v)

[自6.6以来] 模板 <typename T> const T &&get(const QVariant &&v)

如果 v 包含类型为 T 的对象,则返回包含对象的引用,否则调用具有未定义的行为。

接受可变 v 的重载会解包 v:当在具有匹配类型 T 的空 v 上调用时,调用后 v 不会为空。

这些函数提供与 std::variant 兼容的功能。

此函数是在 Qt 6.6 中引入的。

参阅get_if() 和 data

[别名] QVariantHash

QHash<QString, QVariant> 同义词。

[别名] QVariantList

QList<QVariant> 同义词。

[别名] QVariantMap

QMap<QString, QVariant> 同义词。

[自6.7以来] 模板 <typename T> T qvariant_cast(QVariant &&value)

这是一个重载函数。

将给定的 value 转换为模板类型 T

此函数是在 Qt 6.7 中引入的。

模板 <typename T> T qvariant_cast(const QVariant &value)

将给定的 value 转换为模板类型 T

此函数与 QVariant::value 相同。

参阅QVariant::value

bool operator!=(const QVariant &v1, const QVariant &v2)

如果 v1v2 相等,则返回 false; 否则返回 true

QVariant 使用类型() 的等价运算符进行检查。

不同类型的变体始终比较为不相等,但有几种例外情况

  • 如果两种类型都是数字类型(整数和浮点数),Qt 将使用标准的 C++ 类型提升规则比较这些类型。
  • 如果一个类型是数字,另一个是 QString,Qt 将尝试将 QString 转换为匹配数字类型,如果成功则比较。
  • 如果两个变体都包含指向 QObject 派生类型的指针,则将检查类型是否有关联并指向同一个对象。

QDataStream &operator<<(QDataStream &s, const QVariant &p)

将变体 p 写入流 s

参阅QDataStream 运算符的格式

bool operator==(const QVariant &v1, const QVariant &v2)

如果 v1v2 相等,则返回 true;否则返回 false

QVariant 使用类型() 的等价运算符进行检查。

不同类型的变体始终比较为不相等,但有几种例外情况

  • 如果两种类型都是数字类型(整数和浮点数),Qt 将使用标准的 C++ 类型提升规则比较这些类型。
  • 如果一个类型是数字,另一个是 QString,Qt 将尝试将 QString 转换为匹配数字类型,如果成功则比较。
  • 如果两个变体都包含指向 QObject 派生类型的指针,则将检查类型是否有关联并指向同一个对象。

函数的结果不受 QVariant::isNull 结果的影响,这意味着即使一个值为空而另一个值不为空,两个值也可以相等。

QDataStream &operator>>(QDataStream &s, QVariant &p)

从流 s 中读取一个变体 p

注意:如果流包含非内置类型(见 QMetaType::Type),则必须在变体可以正确加载之前使用 qRegisterMetaType() 或 QMetaType::registerType() 进行注册。如果找到未注册的类型,QVariant 会将损坏标志设置在流中,停止处理并打印警告。例如,对于 QList<int>,它会打印以下内容:

QVariant::load: 未知用户类型,名称为 QList<int>

参阅QDataStream 运算符的格式

© 2024 Qt 公司 Ltd。此处包含的文档贡献者是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款授予的。Qt 及其相关标志是芬兰的 Qt 公司以及/或全球其他国家的商标。所有其他商标均为各自所有者的财产。