1.1 qint8 quint8 qint16 quint16 qint32 quint32 qint64 quint64 qreal .
文档索引
类型 说明 大小
类型 说明 大小
qint8 signed char 1
quint8 unsigned char 1
qint16 signed short 2
quint16 unsigned short 2
qint32 signed int 4
quint32 unsigned int 4
qint64 long long int 8
quint64 unsigned long long int 8
qreal double 8
常用接口
求绝对值
T qAbs(const T &t)
qreal absoluteValue; qreal myValue = ‐4.566;
absoluteValue = qAbs(myValue);
最大值与最小值
T &qMax(const T &value1, const T &value2)
T &qMin(const T &value1, const T &value2)
int myValue = 6;
int yourValue = 4;
int minValue = qMin(myValue, yourValue);// minValue == yourValue
取中间值
const T &qBound(const T &min, const T &value, const T &max)
qint32 value1 = 10;
qint32 value2 = 20;
qint32 value3 = 16;
qint32 boundedValue = qBound(value1, value2, value3);// boundedValue == 16
比较浮点数大小
bool qFuzzyCompare(float p1, float p2)
bool qFuzzyCompare(double p1, double p2)
随机数种子
void qsrand(uint seed);
Threadsafe version of the standard C++ srand() function.
生成随机数
int qrand();
获取环境变量
QByteArray env = qgetenv("Path"); std::cout<
1.2QSize QSizeF
QSize(int width, int height)
QSizeF(qreal width, qreal height)
QSize size(100, 10);size.rheight() += 5;
result:(100,15)
QSize size(100, 10);size.rwidth() += 20;
result:(120,10)
QSize s( 3, 7);QSize r(‐1, 4); s ‐= r;
result:(4,3)
1.3 QPoint QPointF
QPoint(int xpos, int ypos);
QPointF(qreal xpos, qreal ypos);
QPoint p(1, 2);p.rx()‐‐;
result:(0, 2);
QPoint p(1, 2);p.ry()++;
result:(1, 3);
QPoint p(‐1, 4);p = 2.5;
result:(2, 10);
QPoint p( 3, 7);QPoint q(‐1, 4); p += q;
result:(2, 11);
** QRect*
QRect(const QPoint &topLeft, const QPoint &bottomRight)
QRect(const QPoint &topLeft, const QSize &size)
QRect(int x, int y, int width, int height)
QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200),QSize(11, 16));
1.4 QString:Qt字符串操作
QString类提供了一个Unicode字符字符串。
QString(const QChar unicode, int size = 1)
QString(QChar ch)
QString(int size, QChar ch)
QString(QLatin1String str)
QString(const QString &other)
QString(QString &&other)
QString(const char str)
QString(const QByteArray &ba)
1.4.1 初始化
QString str = "TZ";
1.4.2 追加
QString str = "TZ";str.prepend("hello "); //从前面追加 str.append(" EDU"); //从尾端追加
也可以使用push_back,push_front
1.4.3 替换
QString x = "Say yes!"; QString y = "no"; x.replace(4, 3, y);// x == "Say no!"
1.4.4 删除
按位删除
QString s = "Fuck Japan"; s.remove(0, 5);
删除些特定字符
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);
QString s = "Ali Baba";s.remove(QChar('a'));
//Qt::CaseSensitive (default):
QString str = "hello Japan";
str.remove("ll");
1.4.5 QString插入
QString str = "Fuck an"; str.insert(5, QString("Jap"));
1.4.6 判断为Empty | Null
QString().isEmpty(); // returns true
QString("").isEmpty(); // returns true
QString("x").isEmpty(); // returns false
QString("abc").isEmpty(); // returns false
QString().isNull(); // returns true
QString("").isNull(); // returns false
QString("abc").isNull(); // returns false
1.4.7 查找字符串出现的位置
int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
返回第一次搜索到指定字符串的位置,从from开始搜索。
QString x = "sticky question";
QString y = "sti";
x.indexOf(y); // returns 0
x.indexOf(y, 1); // returns 10 //查找到了第二个
stix.indexOf(y, 10); // returns 10
x.indexOf(y, 11); // returns ‐1 //跨过了第二个sti.后面没有sti了,所以返回
1.4.8 查找字符串出现的次数
QString x = "A Sticky Question";
QString y = "sti";x.count(y); //返回1x.count(y, Qt::CaseInsensitive); //返回2
1.4.9 查找是否包含另一字符串
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true
str.contains("peter");// returns false
1.4.10 字符串截取
向左截取
QString x = "tanzhoujiaoyu";QString y = x.left(7); // y == "tanzhou"
向右截取
QString x = "tanzhoujiaoyu";QString y = x.right(6); // y == "jiaoyu"
mid截取
QString x = "Nine pineapples";
QString y = x.mid(5, 4); // y == "pine" 从index=5开始截取,截取4个
QString z = x.mid(5); // z == "pineapples" 从index=5开始截取,截取到末尾
1.4.10 数字转QString
静态方法:[static] QString QString::number(uint n, int base = 10)
默认十进制
qint32 num = 65534;QString str = QString::number(num);
大写十六进制
qint32 num = 65534;QString str = QString::number(num, 16);//fffe
浮点数
默认情况
qreal num = 3.14159265358;QString str = QString::number(num); //3.14159
如果对精度有要求
qreal num = 3.14159265358;QString str = QString::number(num, 'g', 8); //3.1415927
1.4.11 格式化输入
QString arg(const QString &a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) const
int age = 25;QString name = "laowang";// name代替%1,age代替%2
QString str = QString("name is %1, age is %2").arg(name).arg(age);// 结果为name is laowang,age is 25 qreal value = 123.456;str = QString("number: %1").arg(value,0,'f',2);
qDebug() << QStringLiteral("设置小数点位数为两位:") << str; //结果为"number:123.45
1.4.12 与std::string互相转换
QString转std::string
QString qStr = “tanzhoujiaoyu”; std::string str = qStr.toStdString();
PS:怎么转换成C语言的char*
stdStr.c_str(); //C语言的字符串
std::string转QString
std::string str = "tanzhoujiaoyu";QString qStr = QString::fromStdString(str);
1.5 QByteArray
提供一个字节数组(序列),QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char 更方便. 在IO操作中,c语言常使用const char ,而Qt中常使用QByteArray;
1.5.1 初始化和访问
批量初始化
QByteArray ba("Hello");
按字节初始化&访问:
QByteArray ba; ba.resize(5); ba[0] = 0x30; ba[1] = 0x31; ba[2] = 0x32; ba[3] = 0x33; ba[4] = 0x34;
也可以用at访问
QByteArray ba;
ba.resize(5);
ba[0] = 0x30; ba[1] = 0x31;
ba[2] = 0x32; ba[3] = 0x33;
ba[4] = 0x34;
std::cout<
1.5.2 QByteArrar与char*相互转换
QByteArray 转换成 char*
QByteArray ba("Hello");const char * str = ba.constData(); std::cout << str << std::endl;
char* 转换成QByteArray
第一种方法:通过QString的字符集转换
const char *p = "abc"; QString c = QString(p); QByteArray ba = c.toUtf8(); qDebug()<
第二种方法:通过RawData
//const char hello[] = {'h', 'e', 'l', 'l', 'o'}; const char * hello = "hello";QByteArray ba(QByteArray::fromRawData(hello, 5)); qDebug()<
1.6 QVariant
QVariant变量是没有数据类型的。 QVariant类像是最常见的Qt的数据类型的一个共用体(union),一个QVariant对象在一个时间只保存一个单一类型的一个单一的值(有些类型可能是多值的,比如字符串列表)。 可以使用toT()(T代表一种数据类型)函数来将QVariant对象转换为T类型,并且获取它的值。这里toT()函数会复 制以前的QVariant对象,然后对其进行转换,所以以前的QVariant对象并不会改变。
只要是数据就必须要使用容器,程序中的数据放在容器中方便增删改查。
Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用QVector(QString)。与 STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这些容器类更轻量,更安全,更容 易使用。
遍历的方式有多种
STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每一个容器 类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读迭代器比读写迭代 器要快很多,所以应尽可能使用只读迭代器。 STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项目;使 用“*”操作符返回迭代器指向的项目等。需要说明的是,不同于Java风格迭代器,STL风格迭代器是直接指向项目 的。其中一个容器的begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但 是这个迭代器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时,begin()函数等价于end()函数。
2.1 QList
QList list;
list<<"A"<<"B"<<"C"<<"D";
QList::iterator i;//使用读写迭代器
qDebug()<<"the forward is:";
for(i=list.begin();i!=list.end();i++)
{
*i=(*i).toLower();//使用QString的toLower()函数转换为小写
qDebug()<<*i;
}
qDebug()<<"the backward is:";
while(i!=list.begin())
{
--i;
qDebug()<<*i;
}
QList::const_iterator j;//使用只读迭代器
qDebug()<<"the forward is:";
for(j=list.constBegin();j!=list.constEnd();++j)
{
qDebug()<<*j;
}
QList是一个模板类,它提供了一个列表。QList实际上是一个T类型项目的指针数组,所以它支持基于索引的访
问,而且当项目的数目小于1000时,可以实现在列表中间进行快速的插入操作。QList提供了很多方便的接口函数 来操作列表中的项目,例如:
插入操作insert();替换操作replace();移除操作removeAt();移动操作move(); 交换操作swap();在表尾添加项目append();在表头添加项目prepend(); 移除第一个项目removeFirst();移除最后一个项目removeLast(); 从列表中移除一项并获取这个项目takeAt(),还有相应的takeFirst()和takeLast(); 获取一个项目的索引indexOf();
判断是否含有相应的项目contains(); 获取一个项目出现的次数count()。
对于QList,可以使用“<<”操作符来向列表中插入项目,也可以使用“[ ]”操作符通过索引来访问一个项目,其中项目 是从0开始编号的。不过,对于只读的访问,另一种方法是使用at()函数,它比“[ ]”操作符要快很多。
QList qList;
for(int i=0;i<10;i++)
{
qList.append(i);//往后追加
}
qList.prepend(100);//往前追加
// 方法一:用for循环遍历
for(int i=0;i it(qList); //只读迭代器
while (it.hasNext())
{
qDebug() << it.next();
}
qDebug() <<"***********************************************";
/* 方法4.1: STL风格迭代器 只读迭代器 */
QList::iterator itm;
for(itm = qList.begin(); itm != qList.end(); ++itm)
{
qDebug() << (*itm);
}
/* 方法4.1: STL风格迭代器 读写迭代器 */
qDebug()<<"************ stl‐>iterator*********************************************";
for(itm = qList.begin(); itm != qList.end(); ++itm)
{
qDebug() << (*itm);
*itm = (*itm)*6;
}
2.2 QLinkedList
基于迭代器访问的List,方便快速插入、删除
QLinkedList List; List << 1 << 3 << 5;foreach(int i, List){qDebug() << i;}
2.3 QVector
QVector又叫可变向量、可变数组
2.4 QMap
QMap类是一个容器类,它提供了一个基于跳跃列表的字典(a skiplistbased dictionary)。
QMap是Qt的通用容器类之一,它存储(键,值)对并提供了与键相关的值的快速查找。
QMap中提供了很多方便的接口函数,例如: 插入操作insert();获取值value(); 是否包含一个键contains(); 删除一个键remove(); 删除一个键并获取该键对应的值take(); 清空操作clear(); 插入一键多值insertMulti()。
可以使用“[ ]”操作符插入一个键值对或者获取一个键的值,不过当使用该操作符获取一个不存在的键的值时,会默 认向map中插入该键,为了避免这个情况,可以使用value()函数来获取键的值。
当使用value()函数时,如果指定 的键不存在,那么默认会返回0,可以在使用该函数时提供参数来更改这个默认返回的值。
QMap默认是一个键对 应一个值的,但是也可以使用insertMulti()进行一键多值的插入,对于一键多值的情况,更方便的是使用QMap的 子类QMultiMap。
QMap map;
map["one"]=1;// 向map中插入("one",1)
map["three"]=3;
map.insert("seven",7);
qDebug()<
2.5 QHash
QMap与QHash的差别:
QHash具有比QMap更快的查找速度 QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据 QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供 operator<()函数。
QHash Employees;
Employees.insert(1,"Bob");
Employees.insert(2,"Chad");
Employees.insert(3,"Mary");
foreach(int i, Employees.keys())
{
qDebug() << Employees[i];
}
QHashIterator Iter(Employees);
while(Iter.hasNext())
{
Iter.next();
qDebug() << Iter.key() << " = " << Iter.value();
}
注意:容器也可以嵌套使用,例如QMap
3. 常用算法
在头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法。我们可以在任何提供了STL风格迭代器的容器类上使用这些算法,包括QList、QLinkedList、QVector、QMap和QHash。
//顺序排序
// QList list;
// list << 36 << 16 << 66 << 6 << 56;
// qSort(list.begin(), list.end());
// qDebug()< list;
// list << 36 << 16 << 66 << 6 << 56;
// qSort(list.begin(), list.end(), qGreater());
// qDebug()< vect(3);
// qCopy(list.begin(), list.end(), vect.begin());
// foreach (QString item, vect)
// {
// qDebug() << item;
// }
// QStringList list;
// list << "one" << "two" << "three";
// QVector vect1(3);
// qCopy(list.begin(), list.end(), vect1.begin());
// foreach (QString item, vect1)
// {
// qDebug() << item;
// }
// QStringList list;
// list << "one" << "two" << "three";
// QVector vect2(8);
// qCopy(list.begin(), list.end(), vect2.begin());
// foreach (QString item, vect2)
// {
// qDebug() << item;
// }
//qfind
//Qlist使用qfind
QList List;
List << 1 << 5 << 15 << 25;
QList::iterator Iter = qFind(List.begin(), List.end(), 25);
if(Iter != List.end())
{
qDebug() << "Find: " << *Iter;
}
else
{
qDebug() << "Not Find";
}
//QMap使用qfind
QMap Employees;
Employees.insert("c++", "Bob");
Employees.insert("win32", "xiaqi");
Employees.insert("mfc", "laowang");
Employees.insert("qt", "mengfan");
Employees["linux"] = "Danny"; /* Danny 变laowang */
QMap::iterator i = Employees.find("linux");
while (i != Employees.end() && i.key() == "linux")
{
qDebug() << i.key() << i.value() ;
i.value() = "oldwang";
++i;
} /* 再遍历一次 */
i = Employees.begin();
while (i != Employees.end())
{
qDebug() << i.key() << i.value() ;
++i;
}
PS:注意,find只能find其key不能是value