QVariant类
QVariant类类似于对最常见的Qt数据类型进行并行的联合操作。更多...
头文件 | #include <QVariant> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 包括继承成员在内的所有成员列表
- 已弃用成员
- QVariant是隐式共享类的一部分。
公开函数
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) bool | canConvert(QMetaType type) const |
bool | canConvert() 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(T &&value) |
void | setValue(const QVariant &value) |
void | setValue(Q Vanguard &&value) |
void | swap(Q Vanguard &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, Vanguard> | 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<Q Vanguard> | toList() const |
QLocale | toLocale() const |
qlonglong | toLongLong(bool *ok = nullptr) const |
QMap<QString, Vanguard> | 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 | 查看() |
QVariant & | operator=(const QVariant &variant) |
QVariant & | operator=(QVariant &&other) |
静态公共成员
(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) 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) T | qvariant_cast(QVariant &&value) |
T | qvariant_cast(const QVariant &value) |
bool | operator!=(const QVariant &v1, const QVariant &v2) |
QDataStream & | operator<<(QDataStream &s, const QVariant &p) |
bool | operator==(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可以扩展以支持其他类型,而不仅仅是QMetaType::Type枚举中提到的类型。有关详细信息,请参阅创建自定义Qt类型。
关于GUI类型的注释
由于QVariant是Qt核心模块的一部分,因此它不能提供到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()
构造一个无效的变元。
[explicit]
QVariant::QVariant(QMetaType type, const void *copy = nullptr)
构造一个类型为 type 的变元,并在不是 nullptr
时用副本初始化 *copy
(在这种情况下,copy 必须指向类型为 type 的对象)。
注意,您必须传递要存储的对象的地址。
通常,您不需要使用此构造函数,而是使用 QVariant::fromValue() 来从由 QMetaType::VoidStar
和 QMetaType::QObjectStar
表示的指针类型构造变元。
如果 type 不支持复制构造,并且 copy 不是 nullptr
,则变元将为无效。同样,如果 copy 是 nullptr
且 type 不支持默认构造,则变元将为无效。
另请参阅 QVariant::fromMetaType、QVariant::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)
使用 QModelIndex 值 val 构造一个新的变体。
注意:当 "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)
比较 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
。
包含从 QObject 派生的类型指针的 QVariant 也将转换并返回该函数的 true,如果 qobject_cast 到由 targetType 描述的类型将成功。注意,这仅适用于使用 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)
将当前在 *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::VoidStar
和 QMetaType::QObjectStar
表示的指针类型构造变元。
如果 type 不支持复制构造,并且 copy 不是 nullptr
,则变元将为无效。同样,如果 copy 是 nullptr
且 type 不支持默认构造,则变元将为无效。
返回上面描述创建的 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);
[静态,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>();
另请参阅value,fromValue和canConvert。
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;否则返回一个空比特数组。
另请参阅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";否则返回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 返回;否则返回一个无效的日期。
如果类型是 QMetaType::QString,而且字符串不能被解析为 Qt::ISODate 格式的日期,则将返回无效日期。
另请参阅canConvert和convert。
QDateTime QVariant::toDateTime() const
如果变种具有 userType() QMetaType::QDateTime、QMetaType::QDate 或 QMetaType::QString 的用户类型,则将变种作为 QDateTime 返回;否则返回无效的日期/时间。
如果类型是 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 非空:如果值可以被转换为一个 double,则将 ok 设置为 true;否则将该 ok 设置为 false。
另请参阅canConvert和convert。
QEasingCurve QVariant::toEasingCurve() const
如果变种具有 userType() QMetaType::QEasingCurve 的用户类型,则将变种作为 QEasingCurve 返回;否则返回默认的缓动曲线。
另请参阅canConvert和convert。
float QVariant::toFloat(bool *ok = nullptr) const
如果变异体有 QMetaType::Double、QMetaType::Float、QMetaType::Bool、QMetaType::QByteArray、QMetaType::Int、QMetaType::LongLong、QMetaType::QString、QMetaType::UInt 或 QMetaType::ULongLong 类型的话,以此返回它作为浮点数;否则返回 0.0。
如果 ok 非空:如果值可以被转换为一个 double,则将 ok 设置为 true;否则将该 ok 设置为 false。
另请参阅canConvert和convert。
QHash<QString, QVariant> QVariant::toHash() const
如果变异体的类型是 QMetaType::QVariantHash,则以 QHash<QString, QVariant> 的形式返回变异体;否则返回一个空映射。
另请参阅canConvert和convert。
int QVariant::toInt(bool *ok = nullptr) const
如果变异体为 QMetaType::Int、QMetaType::Bool、QMetaType::QByteArray、QMetaType::QChar、QMetaType::Double、QMetaType::LongLong、QMetaType::QString、QMetaType::UInt 或 QMetaType::ULongLong 类型,则将其作为 int 返回;否则返回 0。
如果 ok 非空:如果值可以转换为 int,则 ok 被设为 true;否则 ok 被设为 false。
警告:如果值可以转换为 QMetaType::LongLong 但太大无法在 int 中表示,则结果算术溢出将不会反映在 ok 中。一个简单的解决方案是使用 QString::toInt。
另请参阅canConvert和convert。
QJsonArray QVariant::toJsonArray() const
如果变异体为 QJsonArray 类型,则将其作为 QJsonArray 返回;否则返回一个默认构造的 QJsonArray。
另请参阅canConvert和convert。
QJsonDocument QVariant::toJsonDocument() const
如果变异体为 QJsonDocument 类型,则将其作为 QJsonDocument 返回;否则返回一个默认构造的 QJsonDocument。
另请参阅canConvert和convert。
QJsonObject QVariant::toJsonObject() const
如果变异体为 QJsonObject 类型,则将其作为 QJsonObject 返回;否则返回一个默认构造的 QJsonObject。
另请参阅canConvert和convert。
QJsonValue QVariant::toJsonValue() const
如果变异体为 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,则返回变异体作为长整型;否则返回 0。
如果 ok 非空:如果值可以被转换为 int,*
ok
被设置为 true;否则 *
ok
被设置为 false。
另请参阅canConvert和convert。
QMap<QString, QVariant> QVariant::toMap() const
如果变异体的 type() 等于 QMetaType::QVariantMap,则返回变异体作为 QVariantMap。如果不是,QVariant 将尝试将类型转换为映射并返回它。这将对任何已注册为转换到 QVariantMap 的类型或使用 Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE 声明为关联容器的类型成功。如果这些条件都不成立,此函数将返回空映射。
另请参阅canConvert和convert。
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。
另请参阅canConvert和convert。
QPointF QVariant::toPointF() const
如果 variant 对象的 userType() 函数返回 QMetaType::QPoint 或 QMetaType::QPointF,则返回该 variant 作为 QPointF;否则返回空 QPointF。
另请参阅canConvert和convert。
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。
另请参阅canConvert和convert。
QRect QVariant::toRect() const
如果 variant 对象的 userType() 函数返回 QMetaType::QRect,则返回该 variant 作为 QRect;否则返回无效的 QRect。
另请参阅canConvert和convert。
QRectF QVariant::toRectF() const
如果 variant 对象的 userType() 函数返回 QMetaType::QRect 或 QMetaType::QRectF,则返回该 variant 作为 QRectF;否则返回无效的 QRectF。
另请参阅canConvert和convert。
QRegularExpression QVariant::toRegularExpression() const
如果 variant 是QRegularExpression 类型,则返回 variant 作为 QRegularExpression;否则返回一个空的 QRegularExpression。
另请参阅canConvert和convert。
QSize QVariant::toSize() const
如果 variant 的 userType() 是 QMetaType::QSize 类型,则返回 variant 作为 QSize;否则返回一个无效的 QSize。
另请参阅canConvert和convert。
QSizeF QVariant::toSizeF() const
如果 variant 的 userType() 是 QMetaType::QSizeF 类型,则返回 variant 作为 QSizeF;否则返回一个无效的 QSizeF。
另请参阅canConvert和convert。
QString QVariant::toString() const
如果 variant 的 userType() 包含但不限于以下类型,则返回 variant 作为 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。
在不支持 variant 上调用 QVariant::toString() 将返回一个空字符串。
另请参阅canConvert和convert。
QStringList QVariant::toStringList() const
如果 variant 的 userType() 是 QMetaType::QStringList、QMetaType::QString 或可转换为 QString 的类型 QMetaType::QVariantList,则返回 variant 作为 QStringList;否则返回一个空列表。
另请参阅canConvert和convert。
QTime QVariant::toTime() const
如果 variant 的 userType() 是 QMetaType::QTime、QMetaType::QDateTime 或 QMetaType::QString,则返回 variant 作为 QTime;否则返回一个无效的时间。
如果类型是 QMetaType::QString,且字符串不能解析为Qt::ISODate 格式的时间,则返回无效时间。
另请参阅canConvert和convert。
uint QVariant::toUInt(bool *ok = nullptr) const
如果 variant 的 userType() 是 QMetaType::UInt、QMetaType::Bool、QMetaType::QByteArray、QMetaType::QChar、QMetaType::Double、QMetaType::Int、QMetaType::LongLong、QMetaType::QString 或 QMetaType::ULongLong,则返回 variant 作为无符号整数;否则返回 0。
如果ok非空:如果值可以被转换成无符号整型,则将ok设置为true;否则将ok设置为false。
警告:如果值可以转换成QMetaType::ULongLong但太大而无法在一个无符号整型中表示,则结果溢出将不会反映在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,则将其作为无符号长长整型返回;否则返回0。
如果 ok 非空:如果值可以转换为 int,则 ok 被设为 true;否则 ok 被设为 false。
另请参阅canConvert和convert。
QUrl QVariant::toUrl() const
如果变量的userType为QMetaType::QUrl,则以QUrl的形式返回变量;否则返回一个无效的QUrl。
另请参阅canConvert和convert。
QUuid QVariant::toUuid() const
如果变量的类型为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()以确定是否可以转换类型。如果值不能转换,则返回一个默认构造的值。
如果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>()) { 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:在具有匹配类型 T
的 null 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 中引入的。
[别名]
QVariantHash
与 QHash<QString, QVariant> 同义词。
[别名]
QVariantList
[别名]
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 相同。
bool operator!=(const QVariant &v1, const QVariant &v2)
如果 v1 和 v2 相等,则返回 false
; 否则返回 true
。
QVariant 使用类型() 的等价运算符进行检查。
不同类型的变体始终比较为不相等,但有几种例外情况
- 如果两种类型都是数字类型(整数和浮点数),Qt 将使用标准的 C++ 类型提升规则比较这些类型。
- 如果一个类型是数字,另一个是 QString,Qt 将尝试将 QString 转换为匹配数字类型,如果成功则比较。
- 如果两个变体都包含指向 QObject 派生类型的指针,则将检查类型是否有关联并指向同一个对象。
QDataStream &operator<<(QDataStream &s, const QVariant &p)
将变体 p 写入流 s。
bool operator==(const QVariant &v1, const QVariant &v2)
如果 v1 和 v2 相等,则返回 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>
© 2024 Qt 公司 Ltd。此处包含的文档贡献者是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款授予的。Qt 及其相关标志是芬兰的 Qt 公司以及/或全球其他国家的商标。所有其他商标均为各自所有者的财产。