QtC++与QVariant详解

什么是 QVariant?

QVariant 是 Qt 中的一个类,允许您以一种通用的方式存储和访问数据,即使这些数据具有不同的数据类型。它在许多情况下非常有用,例如在模型视图编程、数据序列化、设置和配置管理等领域。QVariant 可以包含以下类型的数据:

基本数据类型,如整数、浮点数、布尔值、枚举等。
Qt 内置的数据类型,如 QString、QByteArray、QDate、QTime、QDateTime 等。
用户自定义的数据类型,只要您为其定义了 QVariant 转换函数

丰富的示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个QVariant对象并设置其值
    QVariant var;
     // 1. 整数
    int intValue = 42;
    var = QVariant(intValue);

    // 2. 浮点数
    double doubleValue = 3.14159;
    var = QVariant(doubleValue);

    // 3. 字符串
    QString stringValue = "Hello, QVariant!";
    var = QVariant(stringValue);

    // 4. 布尔值
    bool boolValue = true;
    var = QVariant(boolValue);

    // 5. 列表
    QVariantList list;
    list.append(1);
    list.append("Two");
    list.append(3.0);
    var = QVariant(list);

    // 6. Map
    QVariantMap map;
    map["name"] = "Alice";
    map["age"] = 30;
    map["isStudent"] = false;
    var = QVariant(map);

    // 7. 枚举
    enum Color { Red, Green, Blue };
    Color colorValue = Blue;
    var = QVariant(colorValue);

    // 8. 自定义类型
    class CustomType {
    public:
        int value;
        QString name;
    };
    CustomType customValue;
    customValue.value = 123;
    customValue.name = "Custom";
    var = QVariant::fromValue(customValue);

    // 9. 数据类型检查
    if (var.type() == QVariant::Int) {
        int intValue = var.toInt();
    }

    // 10. 数据类型转换
    QString strValue = var.toString();

    // 11. 比较
    QVariant anotherIntValue = QVariant(42);
    if (var == anotherIntValue) {
        qDebug() << "var is equal to anotherIntValue";
    }

    // 12. 访问Map中的值
    QVariantMap mapValue = var.toMap();
    QString name = mapValue["name"].toString();
    int age = mapValue["age"].toInt();

    // 13. 获取枚举值名称
    QString enumName = var.typeName();

    // 14. 清空QVariant
    var.clear();

    // 15. 判断QVariant是否为空
    if (var.isNull()) {
        qDebug() << "var is null";
    }

    // 其他高级方法:

    // 16. QVariant类型的自省
    QVariant::Type type = var.type();

    // 17. QVariant的详细类型信息
    const QMetaObject *metaObject = var.metaObject();

    // 18. 类型是否可转换
    bool canConvert = var.canConvert(QVariant::Int);

    // 19. 从字符串创建QVariant
    QVariant fromStringVar = QVariant::fromValue("42");

    // 20. 将QVariant转为JSON
    QJsonObject jsonObject = var.toJsonValue().toObject();

    // 21. 将JSON转为QVariant
    QVariant fromJsonVar = QVariant::fromValue(jsonObject);

    // 22. 根据类型名创建QVariant
    QVariant typeVar = QVariant::fromType(QMetaType::Int);

    // 23. 使用 QVariantList 创建 QVariant
    QVariantList listVar;
    listVar << 1 << 2 << 3;

    // 24. 使用 QVariantMap 创建 QVariant
    QVariantMap mapVar;
    mapVar["name"] = "John";
    mapVar["age"] = 25;

    // 25. QVariant的复制
    QVariant copyVar = var;

    // 26. 使用 QVariantList 创建 QVariant
    QVariantList listVar2 = QVariantList() << 4 << 5 << 6;

    // 27. 检查是否有值
    if (var.isValid()) {
        qDebug() << "var is valid";
    }

    // 28. 获取 QVariant 内部数据指针
    const void *dataPtr = var.constData();

    // 29. 获取 QVariant 内部数据大小
    int dataSize = var.dataSize();

    // 30. 使用自定义转换函数
    QVariant customConvertedVar = var.value<CustomType>();

    // 31. QDate
    QDate dateValue(2023, 11, 4);
    var = QVariant(dateValue);

    // 32. QTime
    QTime timeValue(14, 30);
    var = QVariant(timeValue);

    // 33. QDateTime
    QDateTime dateTimeValue(QDate(2023, 11, 4), QTime(14, 30));
    var = QVariant(dateTimeValue);

    // 34. QByteArray
    QByteArray byteArrayValue = QByteArray("Hello, QVariant!");
    var = QVariant(byteArrayValue);

    // 35. QStringList
    QStringList stringListValue;
    stringListValue << "One" << "Two" << "Three";
    var = QVariant(stringListValue);

    // 36. QColor
    QColor colorValue(255, 0, 0); // 红色
    var = QVariant(colorValue);

    // 37. QFont
    QFont fontValue("Arial", 12);
    var = QVariant(fontValue);

    // 38. QPoint
    QPoint pointValue(100, 200);
    var = QVariant(pointValue);

    // 39. QSize
    QSize sizeValue(300, 400);
    var = QVariant(sizeValue);

    // 40. QRect
    QRect rectValue(100, 100, 300, 200);
    var = QVariant(rectValue);

    // 41. QVariantList,嵌套QVariant
    QVariantList nestedList;
    nestedList << QVariant(1) << QVariant("Nested") << QVariant(3.0);
    QVariant nestedVar = QVariant(nestedList);
    var = QVariant(nestedVar);

    // 42. QVariantMap,嵌套QVariant
    QVariantMap nestedMap;
    nestedMap["key1"] = QVariant(42);
    nestedMap["key2"] = QVariant("Nested");
    QVariant nestedMapVar = QVariant(nestedMap);
    var = QVariant(nestedMapVar);

    // 43. 多个类型混合的QVariantList
    QVariantList mixedList;
    mixedList << QVariant(42) << QVariant("Mixed") << QVariant(QDate(2023, 11, 4));
    var = QVariant(mixedList);

    // 44. 使用toXxx()函数获取值
    int intValue = var.toInt();
    double doubleValue = var.toDouble();
    QString stringValue = var.toString();
    QDate date = var.toDate();
    QTime time = var.toTime();
    QDateTime dateTime = var.toDateTime();
    QByteArray byteArray = var.toByteArray();
    QStringList stringList = var.toStringList();
    QColor color = var.value<QColor>();
    QFont font = var.value<QFont>();
    QPoint point = var.value<QPoint>();
    QSize size = var.value<QSize>();
    QRect rect = var.value<QRect>();

    // 45. 使用value()函数获取自定义类型
    class CustomType {
    public:
        int value;
        QString name;
    };
    CustomType customValue = var.value<CustomType>();

    // 46. 使用constData()获取数据指针
    const void *dataPtr = var.constData();

    // 47. 检查是否为空
    if (var.isNull()) {
        qDebug() << "var is null";
    }

    // 48. 获取类型名称
    QString typeName = var.typeName();

    // 49. 将QVariant转为JSON字符串
    QString jsonStr = QVariant::fromValue(var).toJsonValue().toString();

    // 50. 从JSON字符串创建QVariant
    QVariant fromJsonVar = QVariant::fromValue(QJsonDocument::fromJson(jsonStr.toUtf8()).toVariant());

// 51. QList
    QList<int> intList;
    intList << 1 << 2 << 3;
    var = QVariant::fromValue(intList);

    // 52. QVector
    QVector<QString> stringVector;
    stringVector << "One" << "Two" << "Three";
    var = QVariant::fromValue(stringVector);

    // 53. QMap
    QMap<QString, int> stringIntMap;
    stringIntMap["One"] = 1;
    stringIntMap["Two"] = 2;
    var = QVariant::fromValue(stringIntMap);

    // 54. QStringList
    QStringList stringList;
    stringList << "Apple" << "Banana" << "Cherry";
    var = QVariant::fromValue(stringList);

    // 55. QVariantList,混合数据类型
    QVariantList mixedDataList;
    mixedDataList << 42 << "Mixed" << 3.14;
    var = QVariant(mixedDataList);

    // 56. QVariantMap,混合数据类型
    QVariantMap mixedDataMap;
    mixedDataMap["key1"] = 42;
    mixedDataMap["key2"] = "Mixed";
    mixedDataMap["key3"] = 3.14;
    var = QVariant(mixedDataMap);

    // 57. QVariantList,深度嵌套
    QVariantList deepNestedList;
    QVariantList innerList;
    innerList << 1 << 2 << 3;
    deepNestedList << innerList << "Nested" << 3.14;
    var = QVariant(deepNestedList);

    // 58. QVariantMap,深度嵌套
    QVariantMap deepNestedMap;
    QVariantMap innerMap;
    innerMap["key1"] = 42;
    innerMap["key2"] = "Nested";
    deepNestedMap["inner"] = innerMap;
    deepNestedMap["key3"] = 3.14;
    var = QVariant(deepNestedMap);

    // 59. QVariantMap,枚举类型
    enum Fruit { Apple, Banana, Cherry };
    QVariantMap enumMap;
    enumMap["fruit"] = Fruit::Apple;
    var = QVariant(enumMap);

    // 60. QVariantList,枚举类型
    QVariantList enumList;
    enumList << Fruit::Apple << Fruit::Banana << Fruit::Cherry;
    var = QVariant(enumList);

    // 61. QVariantList,指针类型
    int* intPointer = new int(42);
    var = QVariant::fromValue(intPointer);

    // 62. QVariantList,QSharedPointer类型
    QSharedPointer<int> sharedInt = QSharedPointer<int>(new int(42));
    var = QVariant::fromValue(sharedInt);

    // 63. QVariantList,自定义类指针
    class CustomType {
    public:
        int value;
        QString name;
    };
    CustomType* customPointer = new CustomType();
    customPointer->value = 42;
    customPointer->name = "CustomPointer";
    var = QVariant::fromValue(customPointer);

    // 64. QVariantList,QList指针
    QList<int>* intListPointer = new QList<int>();
    intListPointer->append(1);
    intListPointer->append(2);
    intListPointer->append(3);
    var = QVariant::fromValue(intListPointer);

    // 65. QVariantList,QMap指针
    QMap<QString, int>* stringIntMapPointer = new QMap<QString, int>();
    stringIntMapPointer->insert("One", 1);
    stringIntMapPointer->insert("Two", 2);
    var = QVariant::fromValue(stringIntMapPointer);

    // 66. QVariantList,QVariantList指针
    QVariantList* nestedListPointer = new QVariantList();
    nestedListPointer->append(1);
    nestedListPointer->append("Nested");
    var = QVariant::fromValue(nestedListPointer);

    // 67. QVariantList,QVariantMap指针
    QVariantMap* nestedMapPointer = new QVariantMap();
    (*nestedMapPointer)["key1"] = 42;
    (*nestedMapPointer)["key2"] = "Nested";
    var = QVariant::fromValue(nestedMapPointer);

    // 68. QVariantList,复合结构
    struct ComplexStruct {
        int intValue;
        QString stringValue;
        QMap<QString, QVariant> dataMap;
    };
    ComplexStruct complexValue = {42, "Complex", stringIntMap};
    var = QVariant::fromValue(complexValue);

    // 69. QVariantList,QVariant指针
    QVariant* varPointer = new QVariant(42);
    var = QVariant::fromValue(varPointer);

    // 70. QVariantList,QVariantList指针
    QVariantList* varListPointer = new QVariantList();
    varListPointer->append(1);
    varListPointer->append("Nested");
    var = QVariant::fromValue(varListPointer);

    // 71. QVariantList,QVariantMap指针
    QVariantMap* varMapPointer = new QVariantMap();
    (*varMapPointer)["key1"] = 42;
    (*varMapPointer)["key2"] = "Nested";
    var = QVariant::fromValue(varMapPointer);

    // 72. 检查是否包含特定类型
    if (var.canConvert(QVariant::Int)) {
        int convertedInt = var.toInt();
        qDebug() << "Can convert to int: " << convertedInt;
    }

    // 73. 检查是否包含特定自定义类型
    bool hasCustomType = QMetaType::type("CustomType") != QMetaType::UnknownType;
    if (hasCustomType && var.canConvert(QMetaType::type("CustomType"))) {
        CustomType custom = var.value<CustomType>();
        qDebug() << "Can convert to CustomType: " << custom.value << custom.name;
    }

    // 74. 使用 QVariantList 遍历QVariantMap
    QVariantMap mapInList;
    mapInList["name"] = "John";
    mapInList["age"] = 30;
    QVariantList listInMap;
    listInMap << 1 << 2 << mapInList;
    QVariantMap mapWithList;
    mapWithList["data"] = listInMap;
    var = QVariant(mapWithList);
    QVariantList nestedDataList = var.toMap()["data"].toList();
    for (const QVariant& item : nestedDataList) {
        if (item.canConvert(QVariant::String)) {
            QString strValue = item.toString();
            qDebug() << "String in nested list: " << strValue;
        }
        else if (item.canConvert(QVariant::Map)) {
            QVariantMap mapValue = item.toMap();
            QString name = mapValue["name"].toString();
            int age = mapValue["age"].toInt();
            qDebug() << "Map in nested list: Name - " << name << ", Age - " << age;
        }
    }

    // 75. 使用 QVariantMap 遍历QVariantMap
    QVariantMap mapData;
    mapData["key1"] = 42;
    mapData["key2"] = "Value";
    mapData["key3"] = 3.14;
    var = QVariant(mapData);
    QVariantMap dataMap = var.toMap();
    for (const QString& key : dataMap.keys()) {
        QVariant value = dataMap[key];
        if (value.canConvert(QVariant::Int)) {
            int intValue = value.toInt();
            qDebug() << "Key: " << key << " - Int Value: " << intValue;
        }
        else if (value.canConvert(QVariant::String)) {
            QString strValue = value.toString();
            qDebug() << "Key: " << key << " - String Value: " << strValue;
        }
        else if (value.canConvert(QVariant::Double)) {
            double doubleValue = value.toDouble();
            qDebug() << "Key: " << key << " - Double Value: " << doubleValue;
        }
    }

    // 76. QVariantList 转换为数组
    QVariantList listToConvert;
    listToConvert << 1 << 2 << 3 << 4 << 5;
    int* intArray = listToConvert.data<int>();
    for (int i = 0; i < listToConvert.size(); ++i) {
        qDebug() << "Array Value: " << intArray[i];
    }

    // 77. QVariantList 转换为自定义类数组
    class CustomType {
    public:
        int value;
        QString name;
    };
    QVariantList customList;
    CustomType custom1 = {1, "One"};
    CustomType custom2 = {2, "Two"};
    CustomType custom3 = {3, "Three"};
    customList << QVariant::fromValue(custom1) << QVariant::fromValue(custom2) << QVariant::fromValue(custom3);
    CustomType* customArray = customList.data<CustomType>();
    for (int i = 0; i < customList.size(); ++i) {
        qDebug() << "Custom Array Value: " << customArray[i].value << customArray[i].name;
    }

    // 78. 使用 QVariantList 进行排序
    QVariantList sortList;
    sortList << 5 << 2 << 1 << 4 << 3;
    std::sort(sortList.begin(), sortList.end(), [](const QVariant& a, const QVariant& b) {
        return a.toInt() < b.toInt();
    });
    qDebug() << "Sorted List: " << sortList;

    // 79. 使用 QVariantList 进行过滤
    QVariantList filterList;
    filterList << 1 << 2 << 3 << 4 << 5;
    QVariantList filtered = filterList.filter([](const QVariant& value) {
        return value.toInt() % 2 == 0;
    });
    qDebug() << "Filtered List: " << filtered;

    // 80. 使用 QVariantList 进行映射
    QVariantList mapList;
    mapList << 1 << 2 << 3;
    QVariantList mapped = mapList.map([](const QVariant& value) {
        return value.toInt() * 2;
    });
    qDebug() << "Mapped List: " << mapped;

    // 81. 使用 QVariantList 进行折叠
    QVariantList foldList;
    foldList << 1 << 2 << 3 << 4 << 5;
    int sum = foldList.fold(0, [](int accumulator, const QVariant& value) {
        return accumulator + value.toInt();
    });
    qDebug() << "Folded Sum: " << sum;

    // 82. 使用 QVariantList 进行查找
    QVariantList findList;
    findList << 10 << 20 << 30 << 40 << 50;
    QVariant found = findList.find([](const QVariant& value) {
        return value.toInt() == 30;
    });
    qDebug() << "Found Value: " << found;

    // 83. 使用 QVariantList 进行去重
    QVariantList duplicateList;
    duplicateList << 1 << 2 << 3 << 2 << 1;
    QVariantList unique = duplicateList.unique();
    qDebug() << "Unique List: " << unique;

    // 84. 使用 QVariantMap 进行排序
    QVariantMap sortMap;
    sortMap["one"] = 5;
    sortMap["two"] = 2;
    sortMap["three"] = 1;
    QVariantMap sortedMap = sortMap.sortedKeys();
    qDebug() << "Sorted Map: " << sortedMap;

    // 85. 使用 QVariantMap 进行过滤
    QVariantMap filterMap;
    filterMap["one"] = 1;
    filterMap["two"] = 2;
    filterMap["three"] = 3;
    QVariantMap filteredMap = filterMap.filter([](const QVariant& key, const QVariant& value) {
        return value.toInt() % 2 == 0;
    });
    qDebug() << "Filtered Map: " << filteredMap;

    // 86. 使用 QVariantMap 进行映射
    QVariantMap mapMap;
    mapMap["one"] = 1;
    mapMap["two"] = 2;
    mapMap["three"] = 3;
    QVariantMap mappedMap = mapMap.map([](const QVariant& key, const QVariant& value) {
        return QVariant(key.toString() + "Squared", value.toInt() * value.toInt());
    });
    qDebug() << "Mapped Map: " << mappedMap;

    // 87. 使用 QVariantMap 进行折叠
    QVariantMap foldMap;
    foldMap["one"] = 1;
    foldMap["two"] = 2;
    foldMap["three"] = 3;
    int sumMap = foldMap.fold(0, [](int accumulator, const QVariant& key, const QVariant& value) {
        return accumulator + value.toInt();
    });
    qDebug() << "Folded Sum in Map: " << sumMap;



    return a.exec();
}

你可能感兴趣的:(QT-GPT知识汇总,qt,c++,开发语言)