QVariant类的作用类似于最常见的Qt数据类型的联合。
Header: | #include <QVariant> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 所有成员的列表,包括继承的成员
- 已弃用的成员(官方不推荐使用)
- QVariant 是隐式共享类的一部分。
【详细描述】
因为C++禁止联合中包含具有非默认构造函数或析构函数的类型,所以大多数有趣的Qt类不能在联合中使用。如果没有 QVariant,对于QObject::property()和数据库工作等方面来说,将是一个问题。
QVariant 对象一次保存单个 typeId() 的一个值(某些类型是多值的,例如字符串列表)。您可以找出QVariant所支持的类型 T,使用convert()将其转换为其他类型,使用 toT() 函数之一(例如 toSize())获取其值,并使用canConvert()检查类型是否可以转换为特定类型。
名为toT() 的函数 (例如toInt(), toString())是 const。如果请求输入存储类型,它们将返回存储对象的副本。如果你要求一个可以从存储类型生成的类型,toT() 会复制和转换,并使对象本身保持不变。如果请求的类型不能从存储类型生成,则结果取决于toT() 中的具体类型。
以下是一些演示 QVariant 使用示例代码:
QDataStream out(...);
QVariant v(123); // 这个variant现在包含一个int
int x = v.toInt(); // x = 123
out << v; // 将类型标记和int写入out
v = QVariant(tr("hello")); // 这个variant现在包含一个QString
int y = v.toInt(); // y = 0 因为v不能被转换为int
QString s = v.toString(); // s = tr("hello")
out << v; // 将类型标记和QString写入out
...
QDataStream in(...); // (打开先前编写的数据流程序)
in >> v; // 读取 Int variant
int z = v.toInt(); // z = 123
qDebug("Type is %s", // prints "Type is int"
v.typeName());
v = v.toInt() + 100; // 这个variant现在的值是223
v = QVariant(QStringList()); // 这个variant现在的值是 QStringList
您甚至可以将 QList<QVariant> 和 QMap<QString, QVariant> 值存储在一个QVariant 中,因此您可以轻松地构建任意类型的任意复杂数据结构。这非常强大且用途广泛,但与在标准数据结构中存储特定类型相比,内存和速度效率可能较低。
QVariant 还支持 null 值的概念。如果变体不包含初始化的值或包含 null 指针,则该变体为 null。
QVariant x; // x.isNull() == true
QVariant y = QVariant::fromValue(nullptr); // y.isNull() == true
QVariant 可以扩展为支持 QMetaType::Type枚举中提到的其他类型。详细信息,参阅 Creating Custom Qt Types 。
关于 GUI 类型的说明
由于QVariant是Qt Core模块的一部分,因此它无法为Qt GUI中定义的数据类型提供转换函数,例如 QColor, QImage和QPixmap。换句话说,没有toColor()功能。相反,您可以使用 QVariant::value() 或 qvariant_cast() 模板函数。例如:
QVariant variant;
...
QColor color = variant.value<QColor>();
对于QVariant支持的所有数据类型(例如QColor到QVariant)是自动的,包括与GUI相关的类型:
QColor color = palette().background().color();
QVariant variant = color;
连续使用 canConvert() 和 convert()
当连续使用canConvert() 和convert() 时,canConvert() 可以返回true,但 convert() 可以返回 false。这通常是因为canConvert() 只报告 QVariant 在给定适当数据类型之间进行转换的一般能力,实际上有可能提供了无法转换的数据。
例如,当对包含字符串的QVariant 调用canConvert(QMetaType::fromType<int>())时,将返回 true,因为原则上,QVariant 能够将数字字符串转换为整数。但是,如果字符串包含非数字字符,则无法将其转换为整数,并且任何转换该字符串的尝试都将失败。因此,必须让两个函数都返回 true 才能成功转换。
另请参见QMetaType。
【公有函数】
1.构造空QVariant对象。 2.然后可以用setValue()函数把具体的值设置到QVariant对象中,静态函数fromValue()的功能与之等价。 【分两步完成对象的构建】 | QVariant() |
对QVariant支持的类进行了封装,最终都是返回一个QVariant类型。 既然最终得到的都是QVariant,那如何知道里面实际是什么类型呢? 可以通过typeId()函数查询,这个函数返回代表元数据ID metaType()的int值。 知道了QVariant对象内部的实际类型,就可以通过toT()函数将其中的数据还原使用了,例如:toByteArray()等。 | QVariant(QMetaType type, const void *copy = nullptr) |
QVariant(QLineF val) | |
QVariant(QRect val) | |
QVariant(QRectF val) | |
QVariant(const QEasingCurve &val) | |
QVariant(const QJsonDocument &val) | |
QVariant(const QPersistentModelIndex &val) | |
QVariant(const char *val) | |
QVariant(QLatin1StringView val) | |
QVariant(std::in_place_type_t<T>, Args &&... args) | |
QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args &&... args) | |
QVariant(int val) | |
QVariant(uint val) | |
QVariant(qlonglong val) | |
QVariant(qulonglong val) | |
QVariant(bool val) | |
QVariant(double val) | |
QVariant(float val) | |
QVariant(QChar c) | |
QVariant(QDate val) | |
QVariant(QTime val) | |
QVariant(const QBitArray &val) | |
QVariant(const QByteArray &val) | |
QVariant(const QDateTime &val) | |
QVariant(const QHash<QString, QVariant> &val) | |
QVariant(const QJsonArray &val) | |
QVariant(const QJsonObject &val) | |
QVariant(const QList<QVariant> &val) | |
QVariant(const QLocale &l) | |
QVariant(const QMap<QString, QVariant> &val) | |
QVariant(const QRegularExpression &re) | |
QVariant(const QString &val) | |
QVariant(const QStringList &val) | |
QVariant(const QUrl &val) | |
QVariant(const QJsonValue &val) | |
QVariant(const QModelIndex &val) | |
QVariant(QUuid val) | |
QVariant(QSize val) | |
QVariant(QSizeF val) | |
QVariant(QPoint val) | |
QVariant(QPointF val) | |
QVariant(QLine val) | |
QVariant(const QVariant &p) | |
QVariant(QVariant &&other) | |
析构。 | ~QVariant() |
bool | canConvert(QMetaType type) const | 如果variant可以强制转换为请求的类型type,则返回true。这种强制转换是在调用 toInt(), toBool(),......等方法。 |
bool | canConvert() const | 如果Variant可以转换为模板类型T,则返回true,否则返回false。 |
bool | canView() const | |
void | clear() | 将variant转换为QMetaType::UnknownType 类型并释放使用的任何资源。 |
const void * | constData() const | |
bool | convert(QMetaType targetType) | |
void * | data() | 返回指向包含对象的指针,该指针为可以写入的通用void*。 该函数分离QVariant。在null-QVariant上调用时,QVariant在调用后不会为null。 |
const void * | data() const | 返回指向包含对象的指针,该指针为无法写入的通用void*。 |
T & | emplace(Args &&... args) | 将当前保存在*this中的对象替换为由args构造的T类型的对象....如果*this为非空,则首先销毁先前持有的对象。如果可能的话,这个方法将重用由QVariant分配的内存。返回对新创建的对象的引用。 |
T & | emplace(std::initializer_list<U> list, Args &&... args) | 此重载是为了支持构造函数采用initializer_list的类型。它的行为等效于非初始值设定项列表重载。 |
bool | isNull() const | 如果这是 null 的QVariant,则返回true,否则为false。 如果QVariant不包含初始化的值或 null 指针,则将其视为 null。 |
bool | isValid() const | 如果此QVariant的存储类型不是QMetaType::UnknownType返回true,否则为false。 |
QMetaType | metaType() const | 返回存储在QVariant中的值的QMetaType。 |
void | setValue(T &&value) | 存储value值的副本。如果T是QVariant不支持的类型,则使用QMetaType来存储值。如果QMetaType不处理该类型,将会发生编译错误。 |
void | setValue(const QVariant &value) | 复制value值到此QVariant上。 |
void | setValue(QVariant &&value) | 移动value值到此QVariant上。 |
void | swap(QVariant &other) | 将两个QVariant 换。此操作非常快,永远不会失败。 |
QBitArray | toBitArray() const | 如果QVariant具有 userType() QMetaType::QBitArray,则以QBitArray 形式返回变量;否则返回一个空bit数组。 |
bool | toBool() const | 如果QVariant具有 userType() Bool,则以Bool形式返回变量。 如果QVariant具有userType() QMetaType::Bool, QMetaType::QChar, QMetaType::Double, QMetaType::Int, QMetaType::LongLong, QMetaType::UInt, QMetaType::ULongLong 并且值 不为0, 或具有QMetaType::QString或 QMetaType::QByteArray并且值不是empty, "0" 或 "false"则返回真,否则返回假。 |
为精简行文,后续关于userType()和QMetaType::QString形式的“严谨”表述均省略,详见帮助文档。 | ||
QByteArray | toByteArray() const | 如果QVariant具有QByteArray或QString(使用QString::fromUtf8()转换),则以QByteArray形式返回变量;否则返回一个空字节数组。 |
QChar | toChar() const | 如果QVariant具有QChar、Int、UInt,则以QChar形式返回变量,否则返回无效QChar。 |
QDate | toDate() const | 如果QVariant具有QDate, QDateTime, QString,则以QDate形式返回变量,如果QString无法解析为格式日期,则返回无效日期。 |
QDateTime | toDateTime() const | 如果QVariant具有QDateTime, QDate, QString,则以QDateTime形式返回变量。否则返回无效的日期/时间。 如果类型为QString,则如果字符串无法解析为Qt::ISODate格式的日期/时间,将返回无效的日期/时间。 |
double | toDouble(bool *ok = nullptr) const | 如果QVariant具有Double, Float, Bool, QByteArray, Int, LongLong, QString, UInt, ULongLong 则以双精度形式返回变量,否则返回0.0。如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。 |
QEasingCurve | toEasingCurve() const | 如果QVariant具有QEasingCurve,则以QEasingCurve形式返回变量;否则返回默认缓动曲线。 |
float | toFloat(bool *ok = nullptr) const | 如果QVariant具有Double, Float, Bool, QByteArray, Int, LongLong, QString, UInt, ULongLong 则以浮点形式返回变量,否则返回0.0。如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。 |
QHash<QString, QVariant> | toHash() const | 如果变量具有QMetaType::QVariantHash,则以 |
int | toInt(bool *ok = nullptr) const | 如果QVariant具有Int、Bool、QByteArray、QChar、Double、LongLong、QString、UInt或ULongLong则以int返回,否则返回0。 如果ok为非空,并且值可以转换为int,则*ok设置为true,否则*ok设置为false。 警告:如果该值可转换为LongLong,但该值太大而无法用int表示,则产生的算术溢出将不会反映在ok中。一个简单的解决方法是使用QString::toInt()。 |
QJsonArray | toJsonArray() const | 如果QVariant具有QJsonArray,则以QJsonArray形式返回变量;否则返回默认构造的QJsonArray。 |
QJsonDocument | toJsonDocument() const | 如果QVariant具有QJsonDocument,则以QJsonDocument形式返回变量;否则返回默认构造的QJsonDocument。 |
QJsonObject | toJsonObject() const | 如果QVariant具有QJsonObject,则以QJsonObject形式返回变量;否则返回默认构造的QJsonObject。 |
QJsonValue | toJsonValue() const | 如果QVariant具有如果变量具有QJsonValue,则以QJsonValue形式返回变量;否则返回默认构造的QJsonValue。 |
QLine | toLine() const | 如果QVariant具有QLine,则以QLine形式返回变量;否则返回无效的QLine。 |
QLineF | toLineF() const | |
QList<QVariant> | toList() const | 如果QVariant具有QVariantList,则以QVariantList形式返回变量。如果没有, QVariant 将尝试将类型转换为List,然后返回它。对于任何注册了转换为 QVariant 的类型或使用Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE声明为顺序容器的类型,此操作都将成功。如果这些条件都不成立,该函数将返回一个空List。 |
QLocale | toLocale() const | 如果QVariant具有QLocale,则以QLocale形式返回变量;否则返回无效的QLocale。 |
qlonglong | toLongLong(bool *ok = nullptr) const | 如果QVariant具有long long,Bool,QByteArray,QChar,Double,Int,QString,UInt或ulong long,则以long long int形式返回变量。否则返回0。 如果ok为非空,并且值可以转换为LongLong,则*ok设置为true,否则*ok设置为false。 |
QMap<QString, QVariant> | toMap() const | 如果QVariant具有QVariantMap,则以QVariantMap的形式返回变量。如果没有,QVariant将尝试将类型转换为map返回。对于任何注册了到QVariantMap 或使用Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE声明为关联容器的类型,此操作都将成功。如果这些条件都不成立,该函数将返回一个空map。 |
QModelIndex | toModelIndex() const | 如果QVariant具有QModelIndex ,则以QModelIndex形式返回变量;否则返回默认构造的QModelIndex。 |
QPersistentModelIndex | toPersistentModelIndex() const | 如果QVariant具有QPersistentModelIndex,则以QPersistentModelIndex的形式返回变量;否则返回默认构造的QPersistentModelIndex。 |
QPoint | toPoint() const | 如果QVariant具有如果变量具有 QPoint或QPointF,则以QPoint形式返回变量;否则返回空的QPoint。 |
QPointF | toPointF() const | 如果QVariant具有如果变量具有 QPoint或QPointF,则以 QPointF形式返回变量;否则返回空的QPointF。 |
qreal | toReal(bool *ok = nullptr) const | 如果QVariant具有Double、Float、Bool、QByteArray、Int、LongLong、QString、UInt或ULongLong,则以qreal形式返回变量。否则返回0.0。 如果ok为非空,并且值可以转换为双精度值,则*ok设置为true,否则*ok设置为false。 |
QRect | toRect() const | 如果QVariant具有QRect,则以QRect形式返回变量;否则返回无效的QRect。 |
QRectF | toRectF() const | 如果QVariant具有QRect 或 QRectF; ,则以QRectF 形式返回变量;否则返回无效的QRectF 。 |
QRegularExpression | toRegularExpression() const | 如果QVariant具有 QRegularExpression,则以 QRegularExpression的形式返回变量;否则返回空 QRegularExpression。 |
QSize | toSize() const | 如果QVariant具有如果变量具有QSize,则以QSize形式返回变量;否则返回无效的QSize。 |
QSizeF | toSizeF() const | |
QString | toString() const | 如果QVariant具有以下用户类型,则以QString形式返回变量,包括但不限于:QString、Bool、QByteArray、QChar、QDate、DateTime、Double、Int、LongLong、QStringList、QTime、UInt或ULongLong。 对不支持的Variant调用QVariant::toString()会返回空字符串。 |
QStringList | toStringList() const | 如果QVariant具有可转换为QString类型的QStringList、QString或QVariantList,则以QStringList形式返回变量。否则返回一个空List。 |
QTime | toTime() const | 如果QVariant具有QTime、QDateTime或QString,则以QTime形式返回变量,否则返回无效时间。 如果 type()是QString,则当字符串无法解析为Qt::ISODate格式时间时,将返回无效时间。 |
uint | toUInt(bool *ok = nullptr) const | 如果QVariant具有 UInt、Bool、QByteArray、QChar、Double、Int、LongLong、QString或ULongLong,则以 unsigned int形式返回变量,否则返回0。 如果ok为非空,并且值可以转换 unsigned int,则*ok设置为true,否则*ok设置为false。 警告:如果该值可转换为ULongLong,但由于太大而无法用无符号int表示,则产生的算术溢出将不会反映在ok中。一个简单的解决方法是使用 QString::toUInt()。 |
qulonglong | toULongLong(bool *ok = nullptr) const | 如果QVariant具有ULongLong、Bool、QByteArray、QChar、Double、Int、LongLong、QString或UInt,则以无符号长整型返回变量;否则返回0。 如果ok为非空,并且值可以转换 int,则*ok设置为true,否则*ok设置为false。 |
QUrl | toUrl() const | 如果QVariant具有QUrl ,则以QUrl 形式返回变量;否则返回无效的QUrl。 |
QUuid | toUuid() const | 如果QVariant具有QUuid 、QByteArray或QString,则以QUuid 形式返回变量。否则返回默认构造的QUuid。 |
int | typeId() const | |
const char * | typeName() const | 返回存储在变量中的类型的名称。返回的字符串描述用于存储数据的C++数据类型。例如:“QFont”、“QString”或“QVariantList”。无效的变量返回0。 |
int | userType() const | 返回存储在QVariant中的值的存储类型,它是元类型metaType() 的id。 |
T | value() const | / |
返回转换为模板类型T的存储值,调用canConvert() 确定类型是否可以转换。如果该值无法转换,将返回默认构造的值 default-constructed value 。 如果QVariant支持T类型,则该函数的行为与 toString(), toInt()等完全相同。 如果QVariant包含从QObject派生的类型的指针,则T可以是任何QObject类型。如果存储在QVariant中的指针可以被qobject_cast 转换为T,则返回该结果,否则返回nullptr。 请注意,这只适用于使用Q_OBJECT 宏的QObject子类。 如果QVariant包含一个顺序容器并且T是QVariantList,则该容器的元素将被转换为q variant并作为QVariantList返回。 | ||
T | view() | 返回存储值的模板类型T的可变视图。调用canView() 来确定是否支持这样的视图。如果无法创建这样的视图,则返回转换为模板类型的存储值,调用canConvert() 来确定类型是否可以转换。如果该值既不能查看也不能转换,将返回默认构造的值 default-constructed value。 |
QVariant & | operator=(const QVariant &variant) | 将变量variant的值赋给此变量。 |
QVariant & | operator=(QVariant &&other) | 移动分配(move-assigns)other给此QVariant实例。 |
【静态公有成员】
QPartialOrdering | compare(const QVariant &lhs, const QVariant &rhs) |
比较左侧和右侧的物体以进行排序。 如果不支持比较或值无序,则返回QPartialOrdering::Unordered。否则,如果lhs小于、等于或大于rhs,则分别返回 QPartialOrdering::Less, QPartialOrdering::Equivalent or QPartialOrdering::Greater。 如果变量包含具有不同元类型的数据,则这些值被视为无序的,除非它们都是数值或指针类型,在这种情况下将使用常规的数值或指针比较规则。 注意:如果进行了数值比较并且至少有一个值是NaN,则返回 QPartialOrdering::Unordered。 如果两个变量包含相同元类型的数据,该方法将使用QMetaType::compare方法来确定两个变量的排序,这也表明它无法在两个值之间建立排序。 | |
QVariant | fromStdVariant(const std::variant<Types...> &value) |
QVariant | fromStdVariant(std::variant<Types...> &&value) |
返回一个QVariant,其类型和值为活动变量的值value。如果活动类型是std::monostate,则返回默认的QVariant。 注意:使用这种方法,您不需要将变量注册为Qt元类型,因为std::variant在存储之前已被解析。但是,应该注册组件类型。 | |
QVariant | fromValue(const T &value) |
QVariant | fromValue(T &&value) |
返回一个包含value值副本的QVariant,行为与setValue()完全相同。 |
【相关非成员】
QVariantHash | |
QVariantList | |
QVariantMap | |
T & | get(QVariant &v) |
const T & | get(const QVariant &v) |
T && | get(QVariant &&v) |
const T && | get(const QVariant &&v) |
T * | get_if(QVariant *v) |
const T * | get_if(const QVariant *v) |
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) |