Qt是个大而全的应用程序开发框架,相对于C++标准库,开发Qt程序时直接使用Qt提供的字符串、容器、算法库更加方便,这篇笔记我们简单介绍一下相关内容。
Qt开发中,我们可以使用3种类型的字符串:
string
字符串类型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类型值,比如QColor
、QSize
等,能够更简单方便的实现容器的多类型存储。
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