1.Qt 中的源码容器(Container)
2.Qmap应用大全
3.Qt开发-容器类(译)
4.Qt容器类:迭代器
5.如何在Qt 中使用 C++ unordered_map
6.Qml组件化编程12-多国语言动态翻译
Qt 中的容器(Container)
本节内容主要介绍 Qt 容器的特点与使用。容器在 Qt 中分为顺序容器和关联容器。源码
顺序容器如 QList、源码QLinkedList、源码QVector、源码QStack、源码柱状k线源码QQueue;关联容器则有QMap、源码QMultiMap、源码QHash、源码QMultiHash、源码QSet。源码此外,源码还有特殊容器QCache、源码QContiguousCache。源码所有容器都是源码模板类,理论上可存储任何数据类型,但实际使用受限。
Qt 容器提供两种游标:Java 风格与 STL 风格,分别适用于便利与高效。容器提供 <<() 和 >>() 运算符,用于数据读写。使用容器时注意,不能存储不能拷贝构造或赋值的对象,如 QWidget、QTimer,但可以存储指针。
Qt 提供 foreach 关键字用于遍历容器元素,简化代码。使用时需注意 Qt 在进入循环时自动获取容器副本,对大容器影响较大。简单导航网站源码另外,Qt 还提供了其他非模板类型如QBitArray、QByteArray、QString、QStringList。
算法复杂度是选择容器的关键,例如 QVector、QHash、QSet 增加元素复杂度为 O(log n),使用 reserve() 函数可优化为 O(1)。对比 Qt 容器与 STL 容器,它们在风格、隐式共享、Size Type、关联容器的插入操作等方面存在差异。选择容器时,应考虑具体需求和场合。
Qmap应用大全
QMap是Qt中的关键值对容器,功能强大且易于使用。它基于红黑树,支持快速查找、插入和删除,且能自定义排序。在图形界面和网络编程等领域都能找到它的身影。QMap具有以下特性:基于红黑树,操作时间复杂度为O(log n)
自动排序,支持自定义排序函数
支持多值键,即一个键可以关联多个值
提供迭代器便于数据遍历
下面是一些基本用法示例:
创建QMap实例:`QMap map;`
插入数据:`map["Math"] = ;` 或 `map.insert("English", );`
删除数据:`map.remove("Math");`
遍历数据:使用迭代器遍历键值对
查找和修改:`map.value("Math")` 和 `map.insertMulti("Math", );`
检查键值对:`map.contains("Math")` 和 `QList allValues = map.values();`
存储多个值:QMultiMap在需要时支持多值键
然而,QMap的营销名片小程序源码内存开销较大,对于大量数据操作,可能不如散列表(如QHash)高效。在选择数据结构时,需考虑应用需求和数据规模。Qt开发-容器类(译)
Qt库中提供了一套高效、安全和易于使用的容器类,例如QVector、QList、QLinkedList等,它们针对特定需求设计,如QVector适合连续存储,QList在首尾添加快速,QLinkedList适合大列表的插入优化。这些容器是隐式共享、可重入的,并在某些情况下线程安全。Qt支持两种迭代器风格,Java风格更为友好,STL风格更高效。使用QCache和QContiguousCache则可在有限缓存中实现高效查找。
Qt提供的容器类型丰富,包括有序的QList、QLinkedList、QVector(及其子类QStack和QQueue)、关联的QMap、QMultiMap、QHash等,以及特殊用途的QCache和QContiguousCache。QSet用于快速查找,海龟交易法则源码QMap和QMultiMap提供了关联数组功能,QHash和QMultiHash则是基于哈希的快速查找。容器嵌套时,如QMap<Key, QList>,需要注意键值类型和括号的正确使用。
存储在容器中的值必须是可赋值的,如基本类型、指针和Qt类型,但不能直接存储QObject或其子类。对于不可赋值类型,可以使用指针替代。容器还支持Qt的foreach关键字,简化遍历过程。
Qt的迭代器分为Java风格和STL风格,前者更易用但效率略低,后者适用于算法和STL操作,推荐使用只读迭代器。迭代器API提供了增删改查的功能,如QListIterator用于QList,QMapIterator用于QMap等。
在处理算法复杂度时,Qt容器的性能各异,如QLinkedList插入快速而QVector在大量项时插入低效。通过reserve()和squeeze()预分配和释放内存以优化内存使用。
Qt容器类:迭代器
遍历一个容器可以使用迭代器来完成,迭代器提供了一个统一的方法来访问容器中的项目。Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器。如果只是想按顺序遍历一个容器中的项目,那么还可以使用Qt的php自动发货源码foreach关键字。
Java风格的迭代器在Qt4中加入,比STL风格的迭代器更易于使用,但是以轻微的效率作为代价,它们的API以Java的迭代器类为模型。对于每个容器类,都有两种Java风格的迭代器类型:一种是只读,另一种是可读写。在这里,我们只关注QList和QMap。QLinkedList、QVector和QSet与QList的迭代器有同样的接口;QHash与QMap迭代器也有同样的接口。
与STL风格的迭代器不同,Java风格的迭代器指向项之间的位置,而不是直接指向项。由于这个原因,它们指向第一项之前,或者最后一项之后,或者两项之间。下面的图展示了包含4项的list的有效的迭代器位置,用红色箭头表示。
在QList中,可以通过QListIterator实现正序和倒序遍历。正序遍历使用next()函数,倒序遍历使用toBack()函数。在QList中移除元素可以通过QMutableListIterator实现,例如,可以使用QMutableListIterator从QList中移除所有奇数。同样,QList修改可以通过setValue()函数实现,如果想修改某项的值,可以用替换所有大于的值。
STL风格的迭代器自Qt2.0发布以来就可用,它们适用于Qt和STL的泛型算法,并且对速度作了优化。对于每个容器类,有两种STL风格的迭代器类型:只读的和可读写的。尽可能使用只读的迭代器,因为它们比可读写的迭代器要快。STL迭代器的API是以数组中的指针为模型的,比如++运算符将迭代器前移到下一项,*运算符返回迭代器所指的那一项。对于QList和QMap,STL风格的迭代器类型与Java风格的迭代器类型有相同的接口。
使用STL风格的迭代器遍历QList和QMap时,begin()函数返回指向容器中第一项的迭代器,end()函数返回指向容器中最后一项后面一个位置的迭代器。倒序遍历需要我们在获得项之前减少迭代器,这需要一个while循环。如果是只读的,你可以使用const_iterator、constBegin()和constEnd()。下面的表概括了STL风格迭代器的API。
对于QMap和QHash,*运算符返回项的值,如果你想要获得键,只需在迭代器上调用key()。为了对称,迭代器类型还提供了value()函数来获得值。使用foreach关键字遍历容器中的所有项。这个关键字是Qt特有的,与C++语言无关,并且使用了预处理器实现。下面的语法是:foreach (variable, container) statement。例如,如何使用foreach遍历QLinkedList,遍历QMap和QHash可以获得键值对中值的部分。对于一个多值的(multi-valued)map,可以使用迭代器或写法遍历。
如何在Qt 中使用 C++ unordered_map
是这个样子的 标准c++的hash函数定义在functional那个头文件里qt 中定义在<QHash> qHash里面
比如
namespace std{
std::size_t hash(const QString & s){
return qHash(s);
}
}
基本上就是这样了
Qml组件化编程-多国语言动态翻译
本文探讨了《Qml组件化编程》系列文章中的多国语言动态翻译议题。首先回顾Qt原有的国际化方案,虽然在5.版本引入了retranslate接口,但存在翻译不全的问题,如动态加载的ListModel在切换语言时无法自动刷新。为解决此问题,提出了一个非官方的多国语言方案。
新方案采用json文件作为翻译文件,每个文件对应一种语言,以language_xx.json命名,内容包含lang字段表示当前语言和trans字段的翻译项。实现了一个Trans类作为核心翻译器,负责加载翻译包、提供翻译数据,该类声明了支持的所有语言、当前语言、以及用于翻译的trans函数。Trans类中使用QHash等数据结构以确保查询复杂度为O(1)。transString属性在语言切换时触发change信号,确保qml引擎能重新计算表达式并更新UI。
在qml中,通过特殊的属性绑定语法实现动态翻译,当text依赖的属性变化时,会重新计算表达式并更新text值。当语言改变时,虽然没有直接的change信号,但transString属性的改变会触发重新翻译。对于ListModel和格式化字符串,也通过使用动态变量实现动态翻译。
对于批量翻译,作者使用PowerShell脚本调用百度翻译API,提取所有待翻译的字符串后生成对应的json文件。此方案虽然翻译效果不太理想,但仍能作为分享的方法之一。
在Qml中实现的动态翻译功能,虽然在语法上有些别扭,但仍能满足动态翻译的需求。欢迎读者分享更多思路,共同探讨更优的解决方案。
Qt容器类简介
Qt中的容器类较STL轻量、安全且易于使用。它们提供了面向对象的泛型操作,使开发过程更加便捷。
顺序容器中的数据按线性逻辑顺序存储,支持动态变化。它们包括QVector、QList、QLinkedList、QStack和QQueue。
QVector作为动态数组,支持自定义类型,但基本类型仅限于基础数据类型。QList是最常用的顺序容器,提供快速头部和尾部操作,但在个元素以内时可进行快速插入操作。QList支持索引访问,常用算法包括判断是否为空、获取元素数量、插入、替换、交换、移动等。
QLinkedList是一个链表容器,适合元素数量较大的情况,且在插入操作上比QList更高效。不支持索引操作,但支持迭代器,即使进行插入、删除操作,迭代器仍保持有效。
QStack是一个后进先出(LIFO)容器,提供入栈、出栈和获取栈顶元素的方法。QQueue是一个先进先出(FIFO)容器,提供入队、出队和获取队首元素的方法。
关联容器类通过键值对进行数据管理。QMap和QMultiMap分别用于单值和多值关联存储,支持插入、删除、清空等操作。QMap支持使用索引插入或获取键值,使用value()方法获取键值,不存在时默认返回0。
QHash与QMap拥有相似接口,但数据存储无特定顺序,提高了查找速度。QMultiHash为QHash的多值关联版本。
QSet用于存储不重复的T类型元素集合,提供快速查询功能。
容器类支持嵌套,例如QMap与QList的组合,通过键存储QList。注意使用逻辑操作符时需保持适当的空格。
需要注意的是,Object及其子类如QWidget、QDialog、QTimer等不能直接作为容器类的元素,但可以使用它们的指针作为容器的元素,如QList。