本页内容

QVariant Class

QVariant 类的作用类似于最常见的 Qt 数据类型的联合体。更多内容...

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

QVariant 的比较

类别可比较类型
相等性QVariant

公共类型

(since 6.11) class ConstPointer
(since 6.11) class ConstReference
(since 6.11) class Pointer
(since 6.11) class Reference

公共函数

QVariant()
QVariant(QChar c)
QVariant(const QPersistentModelIndex &val)
QVariant(const QRegularExpression &re)
QVariant(const QString &val)
QVariant(const QStringList &val)
QVariant(const QUrl &val)
QVariant(const char *val)
QVariant(double val)
QVariant(float val)
QVariant(int val)
QVariant(qlonglong val)
QVariant(qulonglong val)
QVariant(uint val)
QVariant(QMetaType type, const void *copy = nullptr)
(since 6.12) QVariant(QBitArray &&val)
(since 6.12) QVariant(QByteArray &&val)
(since 6.12) QVariant(QDateTime &&val)
(since 6.12) QVariant(QEasingCurve &&val)
(since 6.12) QVariant(QHash<QString, QVariant> &&val)
(since 6.12) QVariant(QJsonArray &&val)
(since 6.12) QVariant(QJsonDocument &&val)
(since 6.12) QVariant(QJsonObject &&val)
(since 6.12) QVariant(QJsonValue &&val)
(since 6.12) QVariant(QList<QVariant> &&val)
(since 6.12) QVariant(QLocale &&val)
(since 6.12) QVariant(QMap<QString, QVariant> &&val)
(since 6.12) QVariant(QPersistentModelIndex &&val)
(since 6.12) QVariant(QRegularExpression &&val)
(since 6.12) QVariant(QString &&val)
(since 6.12) QVariant(QStringList &&val)
(since 6.12) QVariant(QUrl &&val)
(since 6.6) QVariant(std::in_place_type_t<T>, Args &&... args)
(since 6.6) QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args &&... args)
QVariant(QDate val)
QVariant(QLatin1StringView val)
QVariant(QLine val)
QVariant(QLineF val)
QVariant(QPoint val)
QVariant(QPointF val)
QVariant(QRect val)
QVariant(QRectF val)
QVariant(QSize val)
QVariant(QSizeF val)
QVariant(QTime val)
QVariant(QUuid val)
QVariant(T)
QVariant(bool val)
QVariant(const QBitArray &val)
QVariant(const QByteArray &val)
QVariant(const QDateTime &val)
QVariant(const QEasingCurve &val)
QVariant(const QHash<QString, QVariant> &val)
QVariant(const QJsonArray &val)
QVariant(const QJsonDocument &val)
QVariant(const QJsonObject &val)
QVariant(const QJsonValue &val)
QVariant(const QList<QVariant> &val)
QVariant(const QLocale &l)
QVariant(const QMap<QString, QVariant> &val)
QVariant(const QModelIndex &val)
QVariant(const QVariant &p)
QVariant(QVariant &&other)
~QVariant()
bool canConvert() const
(since 6.0) bool canConvert(QMetaType type) const
bool canView() const
void clear()
const void *constData() const
(since 6.0) bool convert(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)
bool isNull() const
bool isValid() const
(since 6.0) QMetaType metaType() const
void setValue(QVariant &&value)
void setValue(T &&value)
void setValue(const QVariant &value)
void swap(QVariant &other)
QBitArray toBitArray() const
bool toBool() const
QByteArray toByteArray() const
QChar toChar() const
QDate toDate() const
QDateTime toDateTime() const
double toDouble(bool *ok = nullptr) const
QEasingCurve toEasingCurve() const
float toFloat(bool *ok = nullptr) const
QHash<QString, QVariant> toHash() const
int toInt(bool *ok = nullptr) const
QJsonArray toJsonArray() const
QJsonDocument toJsonDocument() const
QJsonObject toJsonObject() const
QJsonValue toJsonValue() const
QLine toLine() const
QLineF toLineF() const
QList<QVariant> toList() const
QLocale toLocale() const
qlonglong toLongLong(bool *ok = nullptr) const
QMap<QString, QVariant> toMap() const
QModelIndex toModelIndex() const
QPersistentModelIndex toPersistentModelIndex() const
QPoint toPoint() const
QPointF toPointF() const
qreal toReal(bool *ok = nullptr) const
QRect toRect() const
QRectF toRectF() const
QRegularExpression toRegularExpression() const
QSize toSize() const
QSizeF toSizeF() const
QString toString() const
QStringList toStringList() const
QTime toTime() const
uint toUInt(bool *ok = nullptr) const
qulonglong toULongLong(bool *ok = nullptr) const
QUrl toUrl() const
QUuid toUuid() const
int typeId() const
const char *typeName() const
int userType() const
T value() const &
T view()
QVariant &operator=(QVariant &&other)
QVariant &operator=(const QVariant &variant)

静态公共成员

(since 6.0) QPartialOrdering compare(const QVariant &lhs, const QVariant &rhs)
(since 6.7) QVariant fromMetaType(QMetaType type, const void *copy = nullptr)
QVariant fromStdVariant(const std::variant<Types...> &value)
(since 6.6) QVariant fromStdVariant(std::variant<Types...> &&value)
QVariant fromValue(const T &value)
(since 6.6) QVariant fromValue(T &&value)
QVariantHash
QVariantList
QVariantMap
(since 6.6) T &get(QVariant&v)
(since 6.6) T &&get(QVariant &&v)
(since 6.6) const T &get(const 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)
T qvariant_cast(const QVariant&value)
(since 6.7) T qvariant_cast(QVariant&&value)
bool operator!=(const QVariant&lhs, const QVariant&rhs)
QDataStream &operator<<(QDataStream&s, const QVariant&p)
bool operator==(const QVariant&lhs, const QVariant&rhs)
QDataStream &operator>>(QDataStream&s, QVariant&p)

详细说明

一个 QVariant 对象每次仅存储单个typeId() 的单个值。(某些类型是多值的,例如字符串列表。) 您可以查询该变体所包含的类型 T,使用 `convert()` 将其转换为其他类型,使用 `toT()` 函数之一(例如 `toSize()`)获取其值,并使用 `canConvert()` 检查该类型是否可转换为特定类型。

名为 toT() 的方法(例如toInt()、toString())均为 const 类型。若查询存储的类型,它们将返回存储对象的副本;若查询可由存储类型生成的类型,toT() 会进行复制和转换,同时保持对象本身不变。 若请求的类型无法从存储类型生成,结果则取决于具体类型;详情请参阅函数文档。

以下是一段演示 QVariant 使用方法的示例代码:

QDataStream out("...");
QVariant v(123);                // 变体现在包含一个 int
intx=v.toInt();              // x = 123
out<<v;                       // 将类型标签和一个 int 写入 out
v=QVariant(tr("hello"));      // 该变体现在包含一个 QString
inty=v.toInt();              // y = 0,因为 v 无法转换为 int
QString s=v.toString();       // s = tr("hello")  (参见 QObject::tr())
out<<v;                       // 将类型标签和一个 QString 写入 out
//...
QDataStream in("...");            // (打开之前写入的流)
in>>v;                        // 读取一个 Int 变体
intz=v.toInt();              // z = 123
qDebug("Type is %s",            // prints "Type is int"
        v.typeName());
v=v.toInt()+ 100;            // 该变体现在存储的值为 223
v=QVariant(QStringList());    // 该变体现在存储一个 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 Core 模块,因此它无法提供转换函数来处理Qt GUI 中定义的数据类型,例如QColor 、QImage 和QPixmap 。换句话说,不存在toColor() 函数。作为替代,您可以使用QVariant::value() 或qvariant_cast() 模板函数。例如:

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

对于 QVariant 支持的所有数据类型(包括与 GUI 相关的类型),反向转换(例如从QColor 转换为 QVariant)均会自动进行:

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

依次使用 canConvert() 和 convert()

当连续使用canConvert() 和convert() 时,可能会出现canConvert() 返回 true,而convert() 返回 false 的情况。这通常是因为canConvert() 仅报告 QVariant 在数据合适时在类型之间进行转换的一般能力;实际上仍有可能提供无法真正转换的数据。

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

另请参阅 QMetaType 。

成员函数文档

[noexcept] QVariant::QVariant()

构建了一个无效的变体。

[noexcept] QVariant::QVariant(QChar c)

使用字符值c 构建一个新的变体。

QVariant::QVariant(const QPersistentModelIndex &val)

创建一个具有QPersistentModelIndex 值的新变体,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 。

QVariant::QVariant(const char *val)

构建一个字符串值为val 的新变体。该变体将val 作为深拷贝,保存到QString 中,并假设输入val 采用 UTF-8 编码。

请注意,val 会被转换为QString 以存储在变体中,而QVariant::userType() 将返回QMetaType::QString 作为该变体的值。

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

[noexcept] QVariant::QVariant(double val)

使用浮点数值val 构建一个新的变体。

[noexcept] QVariant::QVariant(float val)

使用浮点数val 构建一个新的变体。

[noexcept] QVariant::QVariant(int val)

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

[noexcept] QVariant::QVariant(qlonglong val)

创建一个包含长长整数值的新变体,val 。

[noexcept] QVariant::QVariant(qulonglong val)

创建一个包含无符号 long long 整数值的新变体,val 。

[noexcept] QVariant::QVariant(uint val)

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

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

构建一个类型为type 的变体,并使用*copy 的副本对其进行初始化,前提是copy 不为nullptr (在此情况下,copy 必须指向一个类型为type 的对象)。

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

通常,您无需使用此构造函数,而应使用QVariant::fromValue() 来根据QMetaType::VoidStar 和QMetaType::QObjectStar 所表示的指针类型构造变体。

如果type 不支持复制构造,且copy 不等于nullptr ,则该变体将无效。同样地,如果copy 等于nullptr ,且type 不支持默认构造,则该变体将无效。

另请参阅 QVariant::fromMetaType 、QVariant::fromValue() 以及QMetaType::Type 。

[noexcept, since 6.12] QVariant::QVariant(QBitArray &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QByteArray &&val)

这是一个重载函数。

该函数于 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QDateTime &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QEasingCurve &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

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

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QJsonArray &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QJsonDocument &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QJsonObject &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept(...), since 6.12] QVariant::QVariant(QJsonValue &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

注意: 当Private::FitsInInternalSize<sizeof(CborValueStandIn)> 为true 时,该 函数为noexcept。

[noexcept, since 6.12] QVariant::QVariant(QList<QVariant> &&val)

这是一个重载函数。

该函数是在 Qt 6.12 中引入的。

[noexcept, since 6.12] QVariant::QVariant(QLocale &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

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

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QPersistentModelIndex &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QRegularExpression &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QString &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[noexcept, since 6.12] QVariant::QVariant(QStringList &&val)

这是一个重载函数。

该函数是在 Qt 6.12 中引入的。

[noexcept, since 6.12] QVariant::QVariant(QUrl &&val)

这是一个重载函数。

该函数在 Qt 6.12 中引入。

[explicit noexcept(...), since 6.6] template <typename T, typename... Args> requires if_constructible<T, Args...> QVariant::QVariant(std::in_place_type_t<T>, Args &&... args)

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

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

约束

仅当T 可以从args 构造时,才会参与重载解析。

这是一个重载函数。

此函数在 Qt 6.6 中引入。

注意: 当is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value 为true 时,此 函数为 noexcept。

[explicit noexcept(...), since 6.6] template < typename T, typename U, typename... Args > requires if_constructible<T, std::initializer_list<U> &, Args...> 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。

[noexcept] QVariant::QVariant(QDate val)

创建一个包含日期值val 的新变体。

QVariant::QVariant(QLatin1StringView val)

根据val 所处理的Latin-1字符串,构建一个QString 值的新变体。

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

构建一个新的变体,其行值为val 。

注意: 当Private::FitsInInternalSize<sizeof(int) * 4> 为true时,此 函数不满足 noexcept 要求。

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

构建一个新的变体,其行值为val 。

注意: 当 `Private::FitsInInternalSize<sizeof(qreal) * 4> ` 为 `true`时,此 函数为 `noexcept`。

[noexcept] QVariant::QVariant(QPoint val)

构建一个点值为val 的新变体。

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

构建一个点值为val 的新变体。

注意: 当Private::FitsInInternalSize<sizeof(qreal) * 2> 为true时,此 函数不满足 noexcept 要求。

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

构建一个新的变体,其 rect 值为val 。

注意: 当 `Private::FitsInInternalSize<sizeof(int) * 4> ` 为 `true`时,此 函数为 `noexcept`。

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

构建一个新的变体,其 rect 值为val 。

注意: 当Private::FitsInInternalSize<sizeof(qreal) * 4> 为true 时,此 函数为 noexcept。

[noexcept] QVariant::QVariant(QSize val)

创建一个大小值为val 的新变体。

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

构建一个大小值为val 的新变体。

注意: 当Private::FitsInInternalSize<sizeof(qreal) * 2> 为true 时,此 函数为noexcept。

[noexcept] QVariant::QVariant(QTime val)

创建一个包含时间值val 的新变体。

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

根据 UUID 值val 构建一个新的变体。

注意: 当Private::FitsInInternalSize<16> 为true 时,此 函数为 noexcept。

[delete] template <typename T, std::enable_if_t<std::disjunction_v<std::is_pointer<T>, std::is_member_pointer<T>>, bool> = false> QVariant::QVariant(T)

默认构造一个QVariant 的实例。此函数已被删除。

[noexcept] QVariant::QVariant(bool val)

使用布尔值val 创建一个新的变体。

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

使用位数组值val 构建一个新的变体。

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

使用字节数组值val 创建一个新的变体。

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

使用日期/时间值val 构建一个新的变体。

QVariant::QVariant(const QEasingCurve &val)

创建一个带有缓动曲线值val 的新变体。

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

使用QVariant的哈希值构建一个新的变体,val 。

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

使用一个 JSON 数组值(val )创建一个新的变体。

QVariant::QVariant(const QJsonDocument &val)

使用 JSON 文档值val 构建一个新的变体。

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

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

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

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

注意: 当Private::FitsInInternalSize<sizeof(CborValueStandIn)> 为true 时,该 函数为 noexcept。

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

使用列表值val 构建一个新的变体。

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

使用区域设置值 `l` 创建一个新的变体。

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

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

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

创建一个具有QModelIndex 值val 的新变体。

注意: 当Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)> 为true 时,此 函数为 noexcept。

QVariant::QVariant(const QVariant &p)

构建该变体(p )的副本,该变体作为参数传递给此构造函数。

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

通过“move”操作构造一个 QVariant 实例,使其指向与 `other ` 原本指向的同一对象。

[noexcept] QVariant::~QVariant()

销毁QVariant 及其包含的对象。

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()。

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

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

请注意,此函数仅对变体的类型进行操作,而不涉及内容。它仅指示该变体是否存在转换路径可转换为type ,并不表示实际尝试转换时一定会成功。

该函数在 Qt 6.0 中引入。

另请参阅 QMetaType::canConvert()。

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)

比较位于lhs 和rhs 处的对象以确定排序顺序。

如果不支持比较,或者值没有排序,则返回QPartialOrdering::Unordered 。否则,如果lhs 分别小于、等于或大于rhs ,则分别返回QPartialOrdering::Less 、QPartialOrdering::Equivalent 或QPartialOrdering::Greater 。

如果变体包含元类型不同的数据,则这些值被视为无序的,除非它们均为数值型或指针型,此时将采用常规的数值或指针比较规则。

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

如果两个变体都包含相同元类型的数据,该方法将使用 `QMetaType::compare ` 方法来确定两个变体的排序顺序,这也可能表明无法确定这两个值之间的排序顺序。

该函数在 Qt 6.0 中引入。

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

const void *QVariant::constData() const

const void *QVariant::data() const

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

另请参阅 get_if() 和QMetaType 。

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

将变体强制转换为请求的类型,即targetType 。如果无法进行强制转换,变体仍会被转换为请求的类型,但会被置于一种已清空的空状态,类似于由QVariant (Type)构造的状态。

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

如果将qobject_cast 转换为targetType 所描述的类型操作成功,那么包含指向QObject 派生类型指针的QVariant 也会被转换,并使本函数返回true。请注意,这仅适用于使用Q_OBJECT 宏的QObject 子类。

注意: 对于因未初始化或先前转换失败而为空的 QVariant,其转换 将始终失败,此时类型会发生变化,值仍为空,并返回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> requires if_constructible<T, Args...> T &QVariant::emplace(Args &&... args)

将*this 中当前持有的对象替换为类型为T 的对象,该对象由args 和... 构造而成。如果*this 不为空,则会先销毁之前持有的对象。如果可能,该方法将复用由QVariant 分配的内存。返回对新创建对象的引用。

该函数自 Qt 6.6 起引入。

[since 6.6] template < typename T, typename U, typename... Args > requires if_constructible<T, std::initializer_list<U> &, Args...> T &QVariant::emplace(std::initializer_list<U> list, Args &&... args)

此重载旨在支持构造函数接受initializer_list 的类型。其行为与不带初始化列表的重载完全等价。

这是一个重载函数。

该函数首次出现在 Qt 6.6 中。

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

创建一个类型为type 的变体,并使用*copy 的副本对其进行初始化,前提是copy 不属于nullptr (在这种情况下,copy 必须指向一个类型为type 的对象)。

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

通常,您无需使用此构造函数,而应使用QVariant::fromValue() 来根据QMetaType::VoidStar 和QMetaType::QObjectStar 所表示的指针类型构造变体。

如果type 不支持复制构造,且copy 不是nullptr ,则该变体将无效。同样地,如果copy 是nullptr ,且type 不支持默认构造,则该变体将无效。

返回如上所述创建的QVariant 。

该函数在 Qt 6.7 中引入。

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

[static] template <typename... Types> QVariant QVariant::fromStdVariant(const std::variant<Types...> &value)

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

注意:使用 此方法时 ,无需将变体注册为 Qt 元类型,因为 std::variant 在存储之前会被解析。不过,应注册其组成类型。

另请参阅 fromValue()。

[static, since 6.6] template <typename... Types> QVariant QVariant::fromStdVariant(std::variant<Types...> &&value)

这是一个重载函数。

该函数在 Qt 6.6 中引入。

[static] template <typename T> QVariant QVariant::fromValue(const T &value)

返回一个包含value 副本的 `QVariant `。除此之外,其行为与setValue() 完全一致。

示例:

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

另请参阅 setValue() 和value()。

[static, since 6.6] template <typename T> requires if_rvalue<T> QVariant QVariant::fromValue(T &&value)

这是一个重载函数。

该函数在 Qt 6.6 中引入。

bool QVariant::isNull() const

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

如果变体不包含任何已初始化的值或包含一个空指针,则该变体被视为空。

注意:此 行为与 Qt 5 相比已发生变化。在 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 中引入。

void QVariant::setValue(QVariant &&value)

将value 移动到QVariant 上。这相当于直接将value 赋值给QVariant 。

另请参阅 value()。

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>();

另请参阅 value()、fromValue() 和canConvert()。

void QVariant::setValue(const QVariant &value)

将value 复制到QVariant 。这相当于直接将value 赋值给QVariant 。

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

将此变体与other 互换。此操作速度极快,且绝不会失败。

QBitArray QVariant::toBitArray() const

如果该变体具有userType()QMetaType::QBitArray ,则将其作为QBitArray 返回;否则返回一个空位数组。

另请参阅 canConvert() 和convert()。

bool QVariant::toBool() const

如果该变体具有userType() Bool,则将其作为布尔值返回。

如果该变体具有userType()QMetaType::Bool 、QMetaType::QChar 、QMetaType::Double 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::UInt 或QMetaType::ULongLong 属性且其值为非零,或者该变体类型为QMetaType::QString 或QMetaType::QByteArray 且其小写内容不属于以下情况之一:空、"0" 或 "false";则返回true ()。否则返回false 。

另请参阅 canConvert() 和convert()。

QByteArray QVariant::toByteArray() const

如果该变体具有userType()、QMetaType::QByteArray 或QMetaType::QString (使用QString::fromUtf8()进行转换),则将其作为QByteArray 返回;否则返回一个空字节数组。

另请参阅 canConvert() 和convert()。

QChar QVariant::toChar() const

如果该变体具有userType()QMetaType::QChar 、QMetaType::Int 或QMetaType::UInt ,则将其作为QChar 返回;否则返回无效的QChar 。

另请参阅 canConvert() 和convert()。

QDate QVariant::toDate() const

如果该变体包含userType()、QMetaType::QDate 、QMetaType::QDateTime 或QMetaType::QString ,则将其作为QDate 返回;否则返回一个无效日期。

如果metaType()为QMetaType::QString ,当字符串无法解析为Qt::ISODate 格式日期时,将返回无效日期。

另请参阅 canConvert() 和convert()。

QDateTime QVariant::toDateTime() const

如果该变体的格式为userType()QMetaType::QDateTime 、QMetaType::QDate 或QMetaType::QString ,则将其作为QDateTime 返回;否则返回一个无效的日期/时间。

如果metaType()的值为QMetaType::QString ,当字符串无法解析为Qt::ISODate 格式的日期/时间时,将返回一个无效的日期/时间。

另请参阅 canConvert() 和convert()。

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

如果该变体具有以下属性之一:userType()、QMetaType::Double 、QMetaType::Float 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::QString 、QMetaType::UInt 或QMetaType::ULongLong ,则将该变体作为 double 类型返回;否则返回 0.0。

如果ok 不为空:*ok 将被设置为 true(如果该值可以转换为 double);否则*ok 将被设置为 false。

另请参阅 canConvert() 和convert()。

QEasingCurve QVariant::toEasingCurve() const

如果该变体具有userType()QMetaType::QEasingCurve ,则将其作为QEasingCurve 返回;否则返回默认的缓动曲线。

另请参阅 canConvert() 和convert()。

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

如果该变体具有userType()、QMetaType::Double 、QMetaType::Float 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::QString 、QMetaType::UInt 或QMetaType::ULongLong ,则将其作为浮点数返回;否则返回0.0。

如果ok 不为空:*ok 将被设置为 true(如果该值可以转换为 double);否则*ok 将被设置为 false。

另请参阅 canConvert() 和convert()。

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

如果该变体具有metaType()QMetaType::QVariantHash ,则将其作为QHash<QString,QVariant> 返回。如果没有,QVariant 将尝试将该类型转换为哈希,然后返回它。对于任何已在QVariantHash 注册了转换器,或使用Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 声明为关联容器的类型,此操作都会成功。如果上述条件均不成立,则该函数将返回一个空哈希。

另请参见 canConvert() 和convert()。

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

如果该变体具有以下属性之一:userType()、QMetaType::Int 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::QChar 、QMetaType::Double 、QMetaType::LongLong 、QMetaType::QString 、QMetaType::UInt 或QMetaType::ULongLong ,则将该变体作为整数返回;否则返回 0。

如果ok 不为空:*ok 若该值可转换为 int,则设置为 true;否则*ok 设置为 false。

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

另请参阅 canConvert() 和convert()。

QJsonArray QVariant::toJsonArray() const

如果该变体具有userType()QJsonArray ,则将其作为QJsonArray 返回;否则返回一个通过默认构造器构造的QJsonArray 。

另请参阅 canConvert() 和convert()。

QJsonDocument QVariant::toJsonDocument() const

如果该变体具有userType()QJsonDocument ,则将其作为QJsonDocument 返回;否则返回一个默认构造的QJsonDocument 。

另请参阅 canConvert() 和convert()。

QJsonObject QVariant::toJsonObject() const

如果该变体具有userType()QJsonObject ,则将其作为QJsonObject 返回;否则返回一个默认构造的QJsonObject 。

另请参阅 canConvert() 和convert()。

QJsonValue QVariant::toJsonValue() const

如果该变体具有userType()QJsonValue ,则将其作为QJsonValue 返回;否则返回一个通过默认构造创建的QJsonValue 。

另请参阅 canConvert() 和convert()。

QLine QVariant::toLine() const

如果该变体具有userType()QMetaType::QLine ,则将其作为QLine 返回;否则返回一个无效的QLine 。

另请参阅 canConvert() 和convert()。

QLineF QVariant::toLineF() const

如果该变体具有userType()QMetaType::QLineF ,则将其作为QLineF 返回;否则返回一个无效的QLineF 。

另请参阅 canConvert() 和convert()。

QList<QVariant> QVariant::toList() const

如果该变体具有userType()QMetaType::QVariantList ,则将该变体作为QVariantList 返回。否则,QVariant 将尝试将该类型转换为列表,然后返回该列表。对于任何已在QVariantList 注册了转换器,或使用Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE 声明为顺序容器的类型,此操作均会成功。如果上述条件均不成立,则该函数将返回一个空列表。

另请参阅 canConvert() 和convert()。

QLocale QVariant::toLocale() const

如果该变体符合userType()QMetaType::QLocale 的条件,则将其作为QLocale 返回;否则返回一个无效的QLocale 。

另请参阅 canConvert() 和convert()。

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

如果该变体包含以下属性之一:userType()、QMetaType::LongLong 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::QChar 、QMetaType::Double 、QMetaType::Int 、QMetaType::QString 、QMetaType::UInt 或QMetaType::ULongLong ,则将该变体作为 long long int 类型返回;否则返回 0。

如果ok 不为空:*ok 将被设置为 true(如果该值可以转换为 int);否则*ok 将被设置为 false。

另请参阅 canConvert() 和convert()。

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

如果该变体满足metaType()QMetaType::QVariantMap 条件,则将其作为QVariantMap 返回。如果不满足,QVariant 将尝试将该类型转换为映射,然后返回该映射。对于任何已在QVariantMap 注册了转换器,或使用Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 声明为关联容器的类型,此操作均会成功。如果上述条件均不成立,则该函数将返回一个空映射。

另请参阅 canConvert() 和convert()。

QModelIndex QVariant::toModelIndex() const

如果该变体具有userType()QModelIndex ,则将其作为QModelIndex 返回;否则返回一个通过默认构造创建的QModelIndex 。

另请参阅 canConvert()、convert() 和toPersistentModelIndex()。

QPersistentModelIndex QVariant::toPersistentModelIndex() const

如果该变体具有userType()QPersistentModelIndex ,则将其作为QPersistentModelIndex 返回;否则返回一个通过默认构造函数生成的QPersistentModelIndex 。

另请参阅 canConvert()、convert() 和toModelIndex()。

QPoint QVariant::toPoint() const

如果该变体具有userType()QMetaType::QPoint 或QMetaType::QPointF 属性,则将其作为QPoint 返回;否则返回 nullQPoint 。

另请参阅 canConvert() 和convert()。

QPointF QVariant::toPointF() const

如果该变体具有userType()、QMetaType::QPoint 或QMetaType::QPointF ,则将其作为QPointF 返回;否则返回nullQPointF 。

另请参阅 canConvert() 和convert()。

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

如果该变体具有userType()、QMetaType::Double 、QMetaType::Float 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::QString 、QMetaType::UInt 或QMetaType::ULongLong ,则将该变体作为qreal返回;否则返回0.0。

如果ok 不为空:*ok 将被设置为 true(如果该值可以转换为 double);否则*ok 将被设置为 false。

另请参阅 canConvert() 和convert()。

QRect QVariant::toRect() const

如果该变体具有userType()QMetaType::QRect ,则将其作为QRect 返回;否则返回一个无效的QRect 。

另请参阅 canConvert() 和convert()。

QRectF QVariant::toRectF() const

如果该变体具有userType()、QMetaType::QRect 或QMetaType::QRectF ,则将其作为QRectF 返回;否则返回一个无效的QRectF 。

另请参阅 canConvert() 和convert()。

QRegularExpression QVariant::toRegularExpression() const

如果该变体具有userType()QRegularExpression ,则将其作为QRegularExpression 返回;否则返回一个空的QRegularExpression 。

另请参阅 canConvert() 和convert()。

QSize QVariant::toSize() const

如果该变体具有userType()QMetaType::QSize ,则将其作为QSize 返回;否则返回一个无效的QSize 。

另请参阅 canConvert() 和convert()。

QSizeF QVariant::toSizeF() const

如果该变体具有userType()QMetaType::QSizeF ,则将其作为QSizeF 返回;否则返回一个无效的QSizeF 。

另请参阅 canConvert() 和convert()。

QString QVariant::toString() const

如果该变体包含userType(),则将其作为QString 返回,包括但不限于:

QMetaType::QString QMetaType::Bool 、 、 、 、 、 、 、 、 、 、 或 。QMetaType::QByteArray QMetaType::QChar QMetaType::QDate QMetaType::QDateTime QMetaType::Double QMetaType::Int QMetaType::LongLong QMetaType::QStringList QMetaType::QTime QMetaType::UInt QMetaType::ULongLong

对不支持的变体调用 QVariant::toString() 将返回一个空字符串。

另请参阅 canConvert() 和convert()。

QStringList QVariant::toStringList() const

如果该变体具有userType()、QMetaType::QStringList 、QMetaType::QString 或QMetaType::QVariantList ,且其类型可转换为QString ,则将该变体作为QStringList 返回;否则返回一个空列表。

另请参阅 canConvert() 和convert()。

QTime QVariant::toTime() const

如果该变体具有userType()、QMetaType::QTime 、QMetaType::QDateTime 或QMetaType::QString ,则将其作为QTime 返回;否则返回一个无效的时间。

如果metaType() 的值为QMetaType::QString ,且该字符串无法解析为Qt::ISODate 格式的时间,则将返回一个无效的时间。

另请参阅 canConvert() 和convert()。

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

如果该变体具有userType()、QMetaType::UInt 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::QChar 、QMetaType::Double 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::QString 或QMetaType::ULongLong 中的任意一个,则将该变体作为无符号整数返回;否则返回0。

如果 `ok ` 不为空:* ,若该值可转换为 `unsigned int`,则 `ok ` 被设置为 `true`;否则,* ,`ok ` 被设置为 `false`。

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

另请参阅 canConvert() 和convert()。

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

如果该变体具有以下属性之一:metaType()、QMetaType::ULongLong 、QMetaType::Bool 、QMetaType::QByteArray 、QMetaType::QChar 、QMetaType::Double 、QMetaType::Int 、QMetaType::LongLong 、QMetaType::QString 或QMetaType::UInt ,则将该变体作为无符号长长整型返回;否则返回 0。

如果ok 不为空:*ok 将被设置为 true(如果该值可以转换为 int);否则*ok 将被设置为 false。

另请参阅 canConvert() 和convert()。

QUrl QVariant::toUrl() const

如果该变体符合userType()QMetaType::QUrl 的条件,则将其作为QUrl 返回;否则返回一个无效的QUrl 。

另请参阅 canConvert() 和convert()。

QUuid QVariant::toUuid() const

如果该变体具有metaType()QMetaType::QUuid 、QMetaType::QByteArray 或QMetaType::QString ,则将其作为QUuid 返回;否则返回一个默认构造的QUuid 。

另请参阅 canConvert() 和convert()。

int QVariant::typeId() const

int QVariant::userType() const

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

另请参阅 metaType()。

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 包含一个序列容器,且T 的值为QVariantList ,则该容器的元素将被转换为QVariant,并作为QVariantList 返回。

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

QVariant variant=QVariant::fromValue(intList);
if(variant.canConvert<QVariantList>()) {
    QMetaSequence::Iterable iterable=variant.value<QMetaSequence::Iterable>();
    // 可以使用 C++11 的范围 for 循环:
    for(constQVariant&v: iterable) {
        qDebug() << v;
    }
    // 可以使用迭代器:
    QMetaSequence::Iterable::const_iteratorit=iterable.begin();
    constQMetaSequence::Iterable::const_iteratorend=iterable.end();
    for( ; it!=end;++it) {
        qDebug() << *it;
    }
}

另请参阅 setValue()、fromValue()、canConvert() 以及Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()。

template <typename T> T QVariant::view()

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

另请参阅 canView() 和Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE()。

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

将other 分配给此QVariant 实例。

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

将变量variant 的值赋给此变量。

相关非成员

[alias] QVariantHash

QHash 的同义词 <QString,QVariant>。

[alias] QVariantList

QList<QVariant> 的同义词。

[alias] QVariantMap

QMap 的同义词 <QString,QVariant>。

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

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

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

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

如果 `v ` 包含一个类型为 `T` 的对象,则返回该对象的引用;否则,该调用将导致未定义行为。

接受可变v 的重载会解除v 的关联:当对类型匹配的null v (其类型为T )调用该函数时,调用后v 将不为空。

提供这些函数是为了与std::variant 保持兼容。

这些函数在 Qt 6.6 中引入。

另请参阅 get_if() 和data()。

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

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

如果 `v ` 包含一个类型为 `T` 的对象,则返回该对象的指针;否则返回 `nullptr`。

接受可变v 的重载版本会将v 从 中分离:当对类型匹配的null v 调用时,T ,调用后v 将不为空。

提供这些函数是为了与std::variant 保持兼容性。

这些函数在 Qt 6.6 中引入。

另请参阅 data()。

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

返回将给定的value 转换为模板类型T 后的结果。

该函数等同于QVariant::value()。

另请参阅 QVariant::value()。

[since 6.7] template <typename T> T qvariant_cast(QVariant &&value)

返回将给定的value 转换为模板类型T 的结果。

这是一个重载函数。

该函数首次出现在 Qt 6.7 中。

[noexcept] bool operator!=(const QVariant &lhs, const QVariant &rhs)

如果 `lhs ` 和 `rhs ` 相等,则返回 `false `;否则返回 `true`。

QVariant 使用所包含的metaType() 的相等运算符来检查是否相等。

不同类型的变体在比较时始终被视为不相等,但有少数例外情况:

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

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

将变体p 写入流s 。

另请参阅 QDataStream 运算符的格式。

[noexcept] bool operator==(const QVariant &lhs, const QVariant &rhs)

如果 `lhs ` 和 `rhs ` 相等,则返回 `true `;否则返回 `false`。

QVariant 使用所包含的 `metaType()` 的相等运算符来检查是否相等。

不同类型的变体在比较时始终被视为不相等,但有少数例外情况:

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

该函数的结果不受 `QVariant::isNull` 结果的影响,这意味着即使其中一个值为空而另一个不为空,这两个值仍可能相等。

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

从流s 中读取变体p 。

注意:如果 流中包含非内置类型(参见QMetaType::Type ),则必须先使用qRegisterMetaType() 或QMetaType::registerType() 注册这些类型,变体才能被正确加载。如果发现未注册的类型,QVariant 将设置流中的损坏标志,停止处理并输出警告。 例如,对于QList<int>,它将输出以下内容:

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

另请参阅 QDataStream 运算符的格式。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.