首页 > 编程知识 正文

qvariant乱码,qt qfuture

时间:2023-05-06 03:30:12 阅读:27803 作者:2003

另一方面,个人资料QVariant可以保存各种数据类型。 QQ的行为与丙/丙联合相似,但在QQ上比联合强大得多。 QVariant内置支持所有QMetaType:Type声明的类型,例如:int、QString和qfooring,简单地说,QVariant可以存储任意数据类型,并且可以存储JS的var中的Qt的许多功能基于QVariant类,如Qt对象的属性和数据库功能,代码片段主要分为两种情况考虑QVariant的应用。

二、代码片段//一.基本数据类型qvariantnumber(27; 定义名为//number的QVariant变量,假设初始值为27,则这里为int型qDebug () number; //打印结果: qvariant(int,27 ) q调试) number; 字符串列表列表; strlist.append (世卫组织); strlist.append('are ); strlist.append('you ); QMapQString,QVariant myMap; mymap.insert('one ',45 ); //intmymap.insert(two )、) hello ); //qstringmymap.insert('three ',qcolor ) ) 0,0,0 ) ); //qcolormymap.insert('four ',strList; //QStringList类型,所谓容器类型值//mymap.insert('five ',map ); //我试了一下,结果没能在这里转换。 可能不支持此数据类型。 映射为QMap类型QMapIteratorQString,qvariantx(mymap ); for (; x.hasNext (; ) qdebug(x.key ) x.next ).value ); #if0if(x.next ).value ).type )==qvariant 33603360确定string list (/qvariant类型。 在此判断是否是QStringList。 更多的人请用手册查一下。 { qstringstr=qstring('%1”).arg (x.key ); //找到数据类型与QStringList值相对应的键,然后通过键找到值。 这里不能直接使用x.next ().value )。 next是下一个关键值对qDebug ) ) str。 qstringlistmylist=mymap [ str ].tostring list (; //必要的变换for(intm=0; mmyList.size (; m(//qstringlist ) qdebug ) ) myList[m]; }#endif//qdebug(x.next ).value ).type ); //2 .自定义数据类型由于系统中不存在自定义数据类型,即使创建自定义数据类型,编译器也需要注册以方便识别结构结构结构//自定义数据类型{ int age; char name[10]; (; q_declare_metatype(mystruct ) /注册是必需的//上面的代码通常是头文件中的//myStruct stu=//结构初始化//{//100,//' wanglect stu stu.age=100; //也可以先定义变量,然后这样分配strcpy (stu.name,' Hello./n ' ); QQ v; v.setvalue(stu ); QVariant的值qDebug (设定) ' v:'v; myStruct s; //本部分的代码主要是将QVariant类重新转换为myStruct类,即使将其他QVariant类转换为其他类,也可以使用这种方法将s=v.valuemyStruct (; qDebug () s: ) s.ages.name; 要在QVariant中使用自定义类型或其他非QMetaType内置类型,请使用此宏Q_DECLARE_METATYPE

要在信号和插槽中使用非QMetaType内置类型,必须

使用qRegisterMetaType

三、源码赏析 1.数据成员

QVariant的数据成员很简单,只有一句:

Private d;

Private 定义:

struct Private{ union Data { char c; uchar uc; short s; signed char sc; ushort us; int i; uint u; long l; ulong ul; bool b; double d; float f; qreal real; qlonglong ll; qulonglong ull; QObject *o; void *ptr; PrivateShared *shared; } data; uint type : 30; uint is_shared : 1; uint is_null : 1;};

Private是一个结构体,核心数据成员是data,是一个union数据类型,可以存储各种整型,浮点型,QObject类指针,任意指针,共享数据指针。type指示了data中存储的数据类型,is_shared代表数据是否是共享的,is_null代表data是否为空。

那么看看type可以指示的类型有哪些:

enum Type { Invalid = QMetaType::UnknownType, Bool = QMetaType::Bool, Int = QMetaType::Int, UInt = QMetaType::UInt, LongLong = QMetaType::LongLong, ULongLong = QMetaType::ULongLong, Double = QMetaType::Double, Char = QMetaType::QChar, Map = QMetaType::QVariantMap, List = QMetaType::QVariantList, String = QMetaType::QString, StringList = QMetaType::QStringList, ByteArray = QMetaType::QByteArray, BitArray = QMetaType::QBitArray, Date = QMetaType::QDate, Time = QMetaType::QTime, DateTime = QMetaType::QDateTime, Url = QMetaType::QUrl, Locale = QMetaType::QLocale, Rect = QMetaType::QRect, RectF = QMetaType::QRectF, Size = QMetaType::QSize, SizeF = QMetaType::QSizeF, Line = QMetaType::QLine, LineF = QMetaType::QLineF, Point = QMetaType::QPoint, PointF = QMetaType::QPointF, RegExp = QMetaType::QRegExp, RegularExpression = QMetaType::QRegularExpression, Hash = QMetaType::QVariantHash, EasingCurve = QMetaType::QEasingCurve, Uuid = QMetaType::QUuid, ModelIndex = QMetaType::QModelIndex, PersistentModelIndex = QMetaType::QPersistentModelIndex, LastCoreType = QMetaType::LastCoreType, Font = QMetaType::QFont, Pixmap = QMetaType::QPixmap, Brush = QMetaType::QBrush, Color = QMetaType::QColor, Palette = QMetaType::QPalette, Image = QMetaType::QImage, Polygon = QMetaType::QPolygon, Region = QMetaType::QRegion, Bitmap = QMetaType::QBitmap, Cursor = QMetaType::QCursor, KeySequence = QMetaType::QKeySequence, Pen = QMetaType::QPen, TextLength = QMetaType::QTextLength, TextFormat = QMetaType::QTextFormat, Matrix = QMetaType::QMatrix, Transform = QMetaType::QTransform, Matrix4x4 = QMetaType::QMatrix4x4, Vector2D = QMetaType::QVector2D, Vector3D = QMetaType::QVector3D, Vector4D = QMetaType::QVector4D, Quaternion = QMetaType::QQuaternion, PolygonF = QMetaType::QPolygonF, Icon = QMetaType::QIcon, LastGuiType = QMetaType::LastGuiType, SizePolicy = QMetaType::QSizePolicy, UserType = QMetaType::User, LastType = 0xffffffff // need this so that gcc >= 3.4 allocates 32 bits for Type};

不仅包含了基本数据类型Bool、Int、Double等,还包含了core中的数据类型QChar、QPoint、QSize、QRect、QDateTime、QString,容器类型QMap、QList、QHash,gui中的数据类型QColor、QFont、QPalette、QImage、QVector、QMatrix等,还可以添加自定义类型QMetaType::User

2. 构造函数

可以存储Type中的数据类型,构造函数重载自然很多,随便列举些:

QVariant(bool b);QVariant(double d);QVariant(const QString &string);QVariant(const QList<QVariant> &list);QVariant(const QMap<QString,QVariant> &map);QVariant(const QHash<QString,QVariant> &hash);QVariant(const QVariant &other);

也可以通过setValue赋值

template<typename T>inline void setValue(const T &value); 3. 取值

在已知存储类型的情况下,可以直接使用如下函数:

int toInt(bool *ok = Q_NULLPTR) const; uint toUInt(bool *ok = Q_NULLPTR) const; qlonglong toLongLong(bool *ok = Q_NULLPTR) const; qulonglong toULongLong(bool *ok = Q_NULLPTR) const; bool toBool() const; double toDouble(bool *ok = Q_NULLPTR) const; float toFloat(bool *ok = Q_NULLPTR) const; qreal toReal(bool *ok = Q_NULLPTR) const; QByteArray toByteArray() const; QBitArray toBitArray() const; QString toString() const; QStringList toStringList() const; QChar toChar() const; QDate toDate() const; QTime toTime() const; QDateTime toDateTime() const; QList<QVariant> toList() const; QMap<QString, QVariant> toMap() const; QHash<QString, QVariant> toHash() const;#ifndef QT_NO_GEOM_VARIANT QPoint toPoint() const; QPointF toPointF() const; QRect toRect() const; QSize toSize() const; QSizeF toSizeF() const; QLine toLine() const; QLineF toLineF() const; QRectF toRectF() const;#endif QLocale toLocale() const;#ifndef QT_NO_REGEXP QRegExp toRegExp() const;#endif // QT_NO_REGEXP#ifndef QT_BOOTSTRAPPED#ifndef QT_NO_REGULAREXPRESSION QRegularExpression toRegularExpression() const;#endif // QT_NO_REGULAREXPRESSION QUrl toUrl() const; QEasingCurve toEasingCurve() const; QUuid toUuid() const; QModelIndex toModelIndex() const; QPersistentModelIndex toPersistentModelIndex() const; QJsonValue toJsonValue() const; QJsonObject toJsonObject() const; QJsonArray toJsonArray() const; QJsonDocument toJsonDocument() const;#endif // QT_BOOTSTRAPPED

未知情况下,可以先使用canConvert进行查询是否可以转化,然后调用对应toXXX。

bool canConvert(int targetTypeId) const;template<typename T>bool canConvert() const;

自定义数据类型可使用value取值

template<typename T>inline T value() const{ return qvariant_cast<T>(*this); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。