字符串和容器工具类

Qt是个大而全的应用程序开发框架,相对于C++标准库,开发Qt程序时直接使用Qt提供的字符串、容器、算法库更加方便,这篇笔记我们简单介绍一下相关内容。

QString字符串

Qt开发中,我们可以使用3种类型的字符串:

  • C语言兼容的char数组
  • C++标准库的string字符串类型
  • Qt的QString字符串类型

前两种我们比较熟悉了,这里我们主要介绍下QString

操作符

和C++标准库的字符串一样,QString可以使用字面量初始化,++=操作符可以连接字符串。

QString s1 = "Hello, ";
QString s2 = "world!";
QString str = s1 + s2;

==操作符可以判断两个字符串是否完全相同。

QString s1 = "Tom";
QString s2 = "Tom";
bool result = s1 == s2;

字符串模板

QString支持和C++标准库字符串一样的模板方式。

const char *name = "Tom";
int age = 18;
QString str;
str.sprintf("Hello, my name is %s. I am %d years old.", name, age);

注:该方式模板参数不支持QString

QString另一种好用的字符串拼接方式是arg()函数。

QString name = "Tom";
int age = 18;
QString str = "Hello, my name is %1. I am %2 years old.";
str = str.arg(name).arg(age);

arg()函数支持多种类型,而且还可以进行链式调用,非常方便。

工具函数

QString提供了很多工具函数,实现风格比较类似Java,使用也很简单。比如拼接字符串需要的append()preappend(),进行一些判断操作的startsWith()endsWith(),进行转换操作的toInt()toLong()等,使用时参考文档即可,这里就不过多赘述了。

容器

Qt提供了一组简单易用的容器,相比STL容器,Qt容器和框架结合的更好,在Qt程序中应该优先考虑使用。

列表容器

QList<T>是比较常用的列表容器,支持下标访问和迭代器。QList可以存储多种类型,它的底层实现是高度优化的,根据不同类型其底层采用不同的存储结构。

QList<int> list;
list.append(1);
list.append(list[0] + 1);

注:QList要求存储内容必须支持==操作符,至于一般对于较为复杂的类型,比如Qt本身的控件,我们可以存储其指针。

QList支持Java风格和C++风格的两种迭代器,这里我们作为C++开发人员,肯定是使用后者更为熟悉。

QList<int> list;
list.append(1);
list.append(2);
list.append(3);
QList<int>::const_iterator cit = list.cbegin();
while(cit != list.cend())
{
    qDebug() << *(cit++) << " ";
}

当然,如果不需要迭代中删除元素,实际上我们不需要明确写出迭代器,直接使用C++11的foreach功能就行了。

for (int i : list)
{
    qDebug() << i;
}

除了QList,比较常用的还有QVector等,具体参考文档即可。

键值对容器

Qt中,QMap<Key, T>QHash<Key, T>是最常用的两种键值对容器。两者的区别是QMap底层使用类似红黑树的算法实现,QHash则使用哈希表实现。

QHash<QString, QString> provinceCode;
provinceCode.insert("北京", "1");
provinceCode.insert("黑龙江", "2");
provinceCode.insert("广东", "3");

QString hljCode = provinceCode["黑龙江"];

封装类型

熟悉Java、C#等语言的同学肯定很熟悉一个概念:所有类型都继承自同一个基类Object,因此容器泛型类型只要指定一个共同的基类,就可以存储不同的数据类型。C++中实现同样的功能其实更为灵活,比如可以采用void *方式,或者使用union类型等等,但不是那么直观。

Qt中提供了一个QVariant类型,它支持C++基本类型,也支持很多Qt类型值,比如QColorQSize等,能够更简单方便的实现容器的多类型存储。

QVariant v1(0);
QVariant v2(0.0);
QVariant v3("0");

QList<QVariant> list;
list.append(v1);
list.append(v2);
list.append(v3);

for (QVariant v : list)
{
    qDebug() << v.type();
}

上面代码中,我们通过QVariant将不同的数据类型存储到了QList中,其中,QVariant可以看作一个包装对象,我们可以调用type()方法得到其数据的类型。上面代码输出内容如下。

QVariant::int
QVariant::double
QVariant::QString
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap