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() | |
QVariant(QChar c) | |
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.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(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 QPersistentModelIndex &val) | |
QVariant(const QRegularExpression &re) | |
QVariant(const QString &val) | |
QVariant(const QStringList &val) | |
QVariant(const QUrl &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) |
详细说明
由于 C++ 禁止联合体包含具有非默认构造函数或析构函数的类型,因此大多数有趣的 Qt 类都不能在联合体中使用。如果没有 QVariant,这将成为QObject::property() 和数据库工作等的一个问题。
一个 QVariant 对象一次只能保存一个typeId() 的单值。(有些类型是多值的,例如字符串列表。)您可以找出变体持有的类型 T,使用convert() 将其转换为不同的类型,使用 toT() 函数之一(例如toSize() )获取其值,并使用canConvert() 检查是否可以将该类型转换为特定类型。
名为 toT() 的方法(如toInt(),toString() )是常量。如果要求使用存储的类型,这些方法会返回存储对象的副本。如果要求返回的类型可以从存储的类型生成,toT() 方法会复制和转换对象,并保持对象本身不变。如果您要求的类型不能从存储的类型生成,则结果取决于类型;详情请查看函数文档。
下面是一些演示如何使用 QVariant 的示例代码:
QDataStreamout(...);QVariantv(123);// 变量现在包含一个 intintx=v.toInt();// x = 123out<<v;// 向 out 写入一个类型标签和一个 intv=QVariant(tr("hello"));// 变量现在包含一个 QStringinty=v.toInt();// y = 0 因为 v 不能转换为 intQStrings=v.toString();// s = tr("hello") (see QObject::tr())out<<v;// 向 out 写入一个类型标签和一个 QString...QDataStreamin(...);// (打开之前写入的数据流)in>>v;// 读取一个 Int 变量intz=v.toInt();// z = 123qDebug("Type is %s", // prints "Type is int" v.typeName()); v=v.toInt()+ 100;// 变体现在持有值 223v=( QVariant(QStringList());// 变量现在保存一个 QStringList
您甚至可以在变量中存储QList<QVariant> 和QMap<QString, QVariant> 值,因此您可以轻松构建任意类型的复杂数据结构。这种方法功能强大,用途广泛,但在内存和速度方面可能不如在标准数据结构中存储特定类型有效。
QVariant 还支持空值概念。如果一个变量不包含初始化值,或包含一个空指针,那么该变量就是空值。
除QMetaType::Type 枚举中提到的类型外,QVariant 还可扩展以支持其他类型。详情请参阅创建自定义 Qt 类型。
关于图形用户界面类型的说明
由于 QVariant 是Qt Core 模块的一部分,因此它不能为Qt GUI 中定义的数据类型提供转换函数,如QColor 、QImage 和QPixmap 。换句话说,没有toColor()
函数。相反,您可以使用QVariant::value() 或qvariant_cast() 模板函数。例如
对于 QVariant 支持的所有数据类型(包括 GUI 相关类型),反向转换(如从QColor 到 QVariant)都是自动进行的:
连续使用 canConvert() 和 convert()
在连续使用canConvert() 和convert() 时,有可能canConvert() 返回 true,而convert() 返回 false。这通常是因为canConvert() 只报告 QVariant 在给定合适数据的类型间进行转换的一般能力;仍有可能提供实际上无法转换的数据。
例如,当调用包含字符串的变量时,canConvert(QMetaType::fromType<int>())
将返回 true,因为原则上,QVariant 能够将数字字符串转换为整数。但是,如果字符串包含非数字字符,则无法转换为整数,任何转换尝试都将失败。因此,两个函数都返回 true 对于成功转换非常重要。
另请参见 QMetaType 。
成员函数文档
返回变量中存储值的存储类型。这与metaType().id() 相同。
另请参阅 metaType()。
以无法写入的通用 void* 返回指向所包含对象的指针。
[noexcept]
QVariant::QVariant()
构造一个无效变量。
[noexcept]
QVariant::QVariant(QChar c)
构建一个带有字符值的新变量c 。
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)
构造一个新变量,其值为一个 long long 整数,val 。
[noexcept]
QVariant::QVariant(qulonglong val)
构造一个新变量,其值为无符号长整型,val 。
[noexcept]
QVariant::QVariant(uint val)
构造一个新变量,其值为无符号整数,val 。
[explicit]
QVariant::QVariant(QMetaType type, const void *copy = nullptr)
构造type 类型的变量,如果copy 不是nullptr
,则使用*copy
的副本对其进行初始化(在这种情况下,copy 必须指向type 类型的对象)。
请注意,您必须传递希望存储的对象的地址。
通常,您不必使用这个构造函数,而是使用QVariant::fromValue() 从QMetaType::VoidStar
和QMetaType::QObjectStar
所代表的指针类型中构造变体。
如果type 不支持复制构造,且copy 不是nullptr
,那么变体将无效。同样,如果copy 是nullptr
,而type 不支持缺省构造,变体也将无效。
另请参阅 QVariant::fromMetaType,QVariant::fromValue() 和QMetaType::Type 。
[explicit noexcept(...), since 6.6]
template <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)...
进行初始化。
提供此构造函数是为了与 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, 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。
[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。
[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)
构建一个新变量,其散列QVariants,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)
构建一个新的变体,其图谱为QVariants,val 。
[noexcept(...)]
QVariant::QVariant(const QModelIndex &val)
构造一个新变量,其QModelIndex 值为val 。
注: 当Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>
为true
时,此函数为 noexcept。
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 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
QVariant 包含指向从QObject 派生的类型的指针,如果将qobject_cast 转换为模板类型T
会成功,则此函数也将返回 true。请注意,这只适用于使用Q_OBJECT 宏的QObject 子类。
另请参见 convert()。
[since 6.0]
bool QVariant::canConvert(QMetaType type) const
如果变量的类型可以转换为请求的类型,则返回true
,即type 。当调用toInt(),toBool(), ...方法时,这种转换将自动完成。
此函数在 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()。
[since 6.0]
bool QVariant::convert(QMetaType targetType)
将变量转换为请求的类型,targetType 。如果无法完成类型转换,变体仍会被转换为所请求的类型,但会处于类似于QVariant(Type) 所构造的清空状态。
如果变量的当前类型已成功转换,则返回true
;否则返回false
。
QVariant 包含指向从QObject 派生类型的指针,如果指向targetType 所描述类型的qobject_cast 能够成功转换,该函数也将转换并返回 true。请注意,这只适用于使用Q_OBJECT 宏的QObject 子类。
注意: 如果 QVariants 因未初始化或之前的转换失败而为空,则转换将始终失败,它将改变类型,保持为空,并返回false
。
此函数在 Qt 6.0 中引入。
另请参阅 canConvert() 和clear()。
void *QVariant::data()
返回指向所包含对象的指针,指针为可写入的通用 void*。
该函数用于分离QVariant 。当在null-QVariant 上调用该函数时,调用后的QVariant 不会为空。
[since 6.6]
template <typename T, typename... Args, QVariant::if_constructible<T, Args...> = true> T &QVariant::emplace(Args &&... args)
用args...
构建的T
类型的对象替换*this
当前持有的对象。如果*this
为非空,则首先销毁之前持有的对象。如果可能,该方法将重复使用QVariant 分配的内存。返回新创建对象的引用。
此函数在 Qt 6.6 中引入。
[since 6.6]
template <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 中引入。
[static, since 6.7]
QVariant QVariant::fromMetaType(QMetaType type, const void *copy = nullptr)
创建type 类型的变量,如果copy 不是nullptr
,则使用*copy
的副本对其进行初始化(在这种情况下,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)
返回一个QVariant ,其中包含value 的副本。否则,其行为与setValue() 完全相同。
示例:
MyCustomStruct s; return QVariant::fromValue(s);
[static, since 6.6]
template <typename T, QVariant::if_rvalue<T> = true> 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,则以 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 ;否则返回无效日期。
如果 type() 为QMetaType::QString ,字符串无法解析为Qt::ISODate 格式的日期,则返回无效日期。
另请参阅 canConvert() 和convert()。
QDateTime QVariant::toDateTime() const
如果变量有userType()QMetaType::QDateTime,QMetaType::QDate, 或QMetaType::QString ,则返回QDateTime ;否则返回无效日期/时间。
如果 type() 为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 ,如果值可以转换为 double,则设置为 true;否则*
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 ,如果值可以转换为 double,则设置为 true;否则*
ok 设置为 false。
另请参阅 canConvert() 和convert() 。
QHash<QString, QVariant> QVariant::toHash() const
如果变体具有 type()QMetaType::QVariantHash ,则以QHash<QString,QVariant> 的形式返回变体;否则返回空映射。
另请参阅 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 ,则以 int 返回;否则返回 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 会尝试将类型转换为 list,然后返回。对于已注册转换器QVariantList 或使用Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE 声明为顺序容器的任何类型,转换都会成功。如果上述条件都不成立,该函数将返回空 list。
另请参见 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
,如果值可以转换为 int,则设置为 true;否则*
ok
设置为 false。
另请参阅 canConvert() 和convert()。
QMap<QString, QVariant> QVariant::toMap() const
如果变体有 type()QMetaType::QVariantMap ,则以QVariantMap 的形式返回变体。如果没有,QVariant 会尝试将类型转换为映射,然后返回。对于已注册转换器QVariantMap 或使用Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 声明为关联容器的任何类型,转换都将成功。如果上述条件都不成立,该函数将返回空 map。
另请参见 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 的形式返回;否则返回空值QPoint 。
另请参阅 canConvert() 和convert()。
QPointF QVariant::toPointF() const
如果变量有userType()QMetaType::QPoint 或QMetaType::QPointF ,则以QPointF 的形式返回;否则返回空值QPointF 。
另请参阅 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 ,如果值可以转换为 double,则设置为 true;否则*
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 ;否则返回无效时间。
如果 type() 为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 ,则以无符号 int 返回;否则返回 0。
如果ok 为非空:*
ok ,如果值可以转换为无符号 int,则设置为 true;否则*
ok 设置为 false。
警告:如果值可以转换为QMetaType::ULongLong ,但由于太大而无法用无符号 int 表示,则由此产生的算术溢出将不会反映在ok 中。简单的解决方法是使用QString::toUInt()。
另请参阅 canConvert() 和convert()。
qulonglong QVariant::toULongLong(bool *ok = nullptr) const
如果变量类型为()QMetaType::ULongLong,QMetaType::Bool,QMetaType::QByteArray,QMetaType::QChar,QMetaType::Double,QMetaType::Int,QMetaType::LongLong,QMetaType::QString, 或QMetaType::UInt ,则以无符号 long int 返回;否则返回 0。
如果ok 为非空:*
ok ,如果值可以转换为 int,则设置为 true;否则*
ok 设置为 false。
另请参阅 canConvert() 和convert()。
QUrl QVariant::toUrl() const
如果变体有userType()QMetaType::QUrl ,则返回变体的QUrl ;否则返回无效的QUrl 。
另请参阅 canConvert() 和convert()。
QUuid QVariant::toUuid() const
如果变体具有 type()QMetaType::QUuid 、QMetaType::QByteArray 或QMetaType::QString ,则以QUuid 的形式返回变体;否则返回默认构造的QUuid 。
另请参阅 canConvert() 和convert()。
const char *QVariant::typeName() const
返回变量中存储的类型名称。返回的字符串描述了用于存储数据的 C++ 数据类型:例如,"QFont"、"QString"或"QVariantList"。无效变量返回 0。
template <typename T> T QVariant::value() const &
返回转换为模板类型的存储值T
。调用canConvert() 查找类型是否可以转换。如果无法转换,将返回默认构造值。
如果T
类型受QVariant 支持,则此函数的行为与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 ,那么容器中的元素将被转换为QVariants 并作为QVariantList 返回。
QList<int>intList= {7, 11, 42};QVariant变量=QVariant::fromValue(intList);if(variant.canConvert<QVariantList>()) { QSequentialIterableiterable=variant.value<QSequentialIterable>(); // 可以使用foreach:foreach(constQVariant&v,iterable) { qDebug() << v; }// 可以使用 C++11 range-for: for(constQVariant&v: iterable) { qDebug() << v; }// 可以使用迭代器: QSequentialIterable::const_iterator it=iterable.begin();constQSequentialIterable::const_iterator end=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)
Move-assignsother 到此QVariant 实例。
QVariant &QVariant::operator=(const QVariant &variant)
将变量variant 的值分配给此变量。
相关非会员
[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() 。
[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 detachv 的重载:当在类型匹配的null v T
上调用时,调用后v 不会为空。
提供这些函数是为了与std::variant
兼容。
该函数在 Qt 6.6 中引入。
[alias]
QVariantHash
[alias]
QVariantList
[alias]
QVariantMap
template <typename T> T qvariant_cast(const QVariant &value)
返回转换为模板类型T
的给定value 。
该函数等同于QVariant::value()。
另请参见 QVariant::value()。
[since 6.7]
template <typename T> T qvariant_cast(QVariant &&value)
这是一个重载函数。
返回转换为模板类型T
的给定value 。
此函数在 Qt 6.7 中引入。
[noexcept]
bool operator!=(const QVariant &lhs, const QVariant &rhs)
如果lhs 和rhs 相等,则返回false
;否则返回true
。
QVariant 使用 type() 包含的相等运算符来检查是否相等。
不同类型的变量总是比较为不相等,只有少数例外:
- 如果两个类型都是数值类型(整数和浮点数),Qt 将使用标准 C++ 类型推广规则比较这些类型。
- 如果一个类型是数值类型,而另一个类型是QString ,Qt XML 将尝试将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 使用 type() 包含的相等运算符来检查是否相等。
不同类型的变量总是比较为不相等,只有少数例外:
- 如果两个类型都是数值类型(整数和浮点数),Qt 将使用标准 C++ 类型推广规则比较这些类型。
- 如果一个类型是数值类型,而另一个类型是QString ,Qt XML 将尝试将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 操作符的格式。
© 2025 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.