QVariant可以存储的QPolygonF吗?

本文探讨了如何使用QMetaType在C++中进行类型转换,特别是在处理QPointF等高精度数据时,确保精度并演示了转换过程。重点在于避免精度损失和正确类型判断。

答案:可以
源码如下,构造可以传入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
    };

    QVariant() Q_DECL_NOTHROW : d() {}
    ~QVariant();
    QVariant(Type type);

那么精度会损失吗?不会

    QVector<QPointF> poss;
    poss.push_back(QPointF(11.999999, 11.009789999));
    poss.push_back(QPointF(22.5677899, 22.00123499));
    poss.push_back(QPointF(33.884455, 33.776655));
    QVariant vecotrPos = QVariant::fromValue(poss);
    //可转换为QVector<QPointF>
    if (vecotrPos.canConvert<QVector<QPointF>>()) {
        QPolygonF pf = vecotrPos.value<QVector<QPointF>>();
        qDebug() << "QVariant to QVector<QPointF>" << pf;
    } else {
        qDebug() << "can not convert QVector<QPointF>";
    }
    //不能转换为QPolygonF
    if (vecotrPos.canConvert<QPolygonF>()) {
        qDebug() << "QVariant to QVector<QPointF>" << vecotrPos.value<QPolygonF>();
    } else {
        qDebug() << "can not convert QPolygonF" << vecotrPos.value<QPolygonF>();
    }

打印如下

QVariant to QVector<QPointF> QPolygonF(QPointF(12,11.0098)QPointF(22.5678,22.0012)QPointF(33.8845,33.7767))
can not convert QPolygonF QPolygonF()
`QVariant`是Qt框架中的一个强大类型,它可以在运行时存储不同类型的值,包括基本类型、复杂数据结构以及C++对象。在C++中处理`QVariant`的不同类型通常涉及到以下几个步骤: 1. **获取QVariant的类型**: 使用`qvariantType()`函数检查`QVariant`的实际类型。例如: ```cpp QVariant var; QMetaType::Type type = qvariantType(var); ``` 2. **动态类型转换(根据需要)**: 如果你知道`QVariant`具体是什么类型,你可以使用`value()`函数并指定类型来进行转换。如果不确定类型,可以尝试逐个类型转换,但需要注意异常处理: ```cpp if (type == TYPENAME) { Type value = var.value<TYPE>(); // 对value进行操作 } else { // 检查或处理错误 } ``` 3. **使用`operator[]`访问容器**: `QVariant`支持动态数组和可变大小容器(如`QMap`, `QList`等)。可以直接像访问普通变量一样使用它们,但需要确保类型正确: ```cpp QMap<QString, int> map = var.toMap(); int keyValue = map["key"]; ``` 4. **迭代和遍历**: 可以使用`QList<QPair<...>>`或其他适当类型的列表来处理键值对,或者利用`QMetaObject`进行反射操作: ```cpp foreach (const auto& pair, var.toList()) { QString key = pair.first; int value = pair.second.toInt(); } ``` 5. **使用`cast`函数**: 如果`QMetaType`支持,`qvariant_cast()`函数可以更安全地进行强制类型转换,提供了一种在已知类型的情况下避免运行时错误的方式: ```cpp Type safeValue = qvariant_cast<Type>(var); ``` 6. **处理无法转换的情况**: 需要考虑到可能的`QVariant::Invalid`或类型不匹配的情况,可以使用`tryCatch`块捕获异常: ```cpp try { Type value = var.value<TYPE>(); } catch (const QException &e) { // 处理错误 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值