QT---------QT框架功能概述

以下是对Qt中容器类、其他常用基础类等的详细介绍:

容器类

顺序容器类
  • QList:是Qt中最常用的顺序容器类,它以数组的形式存储元素,提供快速的索引访问和插入/删除操作。在内存中是连续存储的,当在列表中间插入或删除元素时,可能需要移动大量元素,但在列表末尾进行操作通常很快。例如:
cpp 复制代码
QList<int> list;
list << 1 << 2 << 3 << 4 << 5;
list.append(6);
list.insert(2, 7); 
int value = list[3]; 
  • QVector :类似于C++ 中的 std::vector,也是动态数组。它在连续的内存块中存储元素,对于随机访问非常高效,但在插入和删除元素时,如果需要移动大量元素,性能可能会下降。适用于需要频繁随机访问元素的场景。例如:
cpp 复制代码
QVector<double> vector;
vector.push_back(1.1);
vector.push_back(2.2);
double sum = 0;
for (int i = 0; i < vector.size(); ++i) {
    sum += vector[i];
}
  • QLinkedList:是一个双向链表容器类,它的优势在于插入和删除元素的速度非常快,无论在链表的哪个位置进行操作,都只需要修改指针,不需要移动大量元素。但随机访问性能较差,因为需要遍历链表来找到指定位置的元素。例如:
cpp 复制代码
QLinkedList<QString> linkedList;
linkedList.append("apple");
linkedList.append("banana");
linkedList.prepend("cherry");
QLinkedList<QString>::iterator it = linkedList.begin();
while (it!= linkedList.end()) {
    qDebug() << *it;
    ++it;
}
关联容器类
  • QMap:是一个基于红黑树实现的关联容器,以键值对的形式存储数据,按键的顺序自动排序。提供高效的插入、查找和删除操作,适用于需要按键快速查找对应值的场景。例如:
cpp 复制代码
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
int value = map.value("two");
QMap<QString, int>::iterator it = map.find("three");
if (it!= map.end()) {
    qDebug() << "Key: " << it.key() << ", Value: " << it.value();
}
  • QHash:也是一种关联容器,它使用哈希表来存储键值对,提供更快的查找速度,但元素的顺序是不确定的。适用于对查找速度要求极高,而对元素顺序不敏感的场景。例如:
cpp 复制代码
QHash<QString, QString> hash;
hash.insert("name", "John");
hash.insert("age", "30");
hash.insert("city", "New York");
QString value = hash.value("age");
QHash<QString, QString>::iterator it = hash.find("city");
if (it!= hash.end()) {
    qDebug() << "Key: " << it.key() << ", Value: " << it.value();
}
  • QMultiMapQMultiHash :分别是 QMapQHash 的变体,允许一个键对应多个值,适用于需要存储多个相同键值对的情况。例如:
cpp 复制代码
QMultiMap<QString, int> multiMap;
multiMap.insert("key", 1);
multiMap.insert("key", 2);
multiMap.insert("key", 3);
QList<int> values = multiMap.values("key");
for (int value : values) {
    qDebug() << value;
}

遍历容器的数据

  • 迭代器遍历 :对于顺序容器和关联容器都适用。例如,遍历 QListQMap
cpp 复制代码
QList<int> list = {1, 2, 3, 4, 5};
QList<int>::iterator listIt;
for (listIt = list.begin(); listIt!= list.end(); ++listIt) {
    qDebug() << *listIt;
}

QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
QMap<QString, int>::iterator mapIt;
for (mapIt = map.begin(); mapIt!= map.end(); ++mapIt) {
    qDebug() << "Key: " << mapIt.key() << ", Value: " << mapIt.value();
}
  • 范围遍历 :C++11 引入的基于范围的 for 循环在Qt中也可以方便地遍历容器。例如:
cpp 复制代码
QList<QString> stringList = {"apple", "banana", "cherry"};
for (const QString& str : stringList) {
    qDebug() << str;
}

QMap<int, QString> intStringMap;
intStringMap.insert(1, "one");
intStringMap.insert(2, "two");
intStringMap.insert(3, "three");
for (const auto& pair : intStringMap) {
    qDebug() << "Key: " << pair.first << ", Value: " << pair.second;
}

其他常用的基础类

QVariant类
  • 功能概述QVariant 类是一个通用的数据类型容器,它可以存储多种不同类型的数据,如基本数据类型、Qt 容器类、自定义类型等。常用于在不同的函数或模块之间传递不确定类型的数据,或者在需要处理多种类型数据的场景中。
  • 示例
cpp 复制代码
QVariant variant;
variant = 10;
qDebug() << variant.toInt();
variant = "Hello";
qDebug() << variant.toString();
QList<int> list = {1, 2, 3};
variant = QVariant::fromValue(list);
QList<int> retrievedList = variant.value<QList<int>>();
for (int value : retrievedList) {
    qDebug() << value;
}
QFlags类
  • 功能概述QFlags 类是一个模板类,用于方便地处理位标志。它允许将多个枚举值组合在一起,通过按位或操作来表示多种状态的组合,常用于表示具有多个可选状态的情况,如窗口的样式、按钮的状态等。
  • 示例
cpp 复制代码
enum class MyFlag {
    Flag1 = 0x01,
    Flag2 = 0x02,
    Flag3 = 0x04
};
Q_DECLARE_FLAGS(MyFlags, MyFlag)
Q_FLAG(MyFlags)

MyFlags flags = MyFlag::Flag1 | MyFlag::Flag3;
if (flags.testFlag(MyFlag::Flag1)) {
    qDebug() << "Flag1 is set";
}
flags &= ~MyFlag::Flag3;
if (!flags.testFlag(MyFlag::Flag3)) {
    qDebug() << "Flag3 is cleared";
}
QRandomGenerator类
  • 功能概述QRandomGenerator 类用于生成随机数。它提供了高质量的随机数生成功能,支持多种随机数分布,如均匀分布、正态分布等,可以满足不同的随机数需求。
  • 示例
cpp 复制代码
QRandomGenerator generator;
int randomNumber = generator.bounded(100);
qDebug() << "Random number between 0 and 99: " << randomNumber;
double randomDouble = generator.generateDouble();
qDebug() << "Random double between 0 and 1: " << randomDouble;
相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript