除了C++提供的基本数据类型之外,Qt还提供了了对开发者而言非常有用的多种数据类型。Qt提供的数据类型分为基本数据类型和类形态的数据类型。
基本数据类型
Qt支持多个平台,创建的应用程序需要在多种平台上都具有相同大小的数据类型。为了能精确指定数据类型的大小,Qt提供了一下的基本数据类型:
类型 | 大小 | 说明 |
bool | 8位 | true/false |
qint8 | 8位 | signed char |
qint16 | 16位 | signed short |
qint32 | 32位 | signed int |
qint64 | 64位 | long long int |
quint8 | 8位 | unsigned char |
quint16 | 16位 | unsigned short |
quint32 | 32位 | unsigned int |
qunit64 | 64位 | unsigned long long int |
float | 32位 | 浮点数 |
double | 64位 | 浮点数 |
const char* | 32位 | 指向字符串常量的指针 |
比较和判断变量的函数
Qt提供了可以比较/判断数据类型值的一般函数和模板函数。下面对这些函数进行简单的介绍:
函数 | 说明 |
T qAbs(const T &value) | 返回绝对值 |
const T& qBound(const T& min,const T& value, const T& max) | 返回最大值和最小值之间值 |
void qCritical(const Char* msg) | 处理Critical消息的函数 |
void qDebug(const Char* msg) | 输出调试信息的函数 |
void qFatal(const Char* msg) | 处理错误信息的函数 |
bool qFuzzyCompare(double p1,double p2)[static] | 比较浮点值的函数 |
bool qFuzzyCompare(float p1,float p2)[static] | 比较浮点值的函数 |
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) | 用户自定义函数,输出Qt定义的调试、预警、严重等消息 |
const T& qMax(const T& value1,const T& value2) | 返回两个值中的最大值 |
const T& qMin(const T& value1,const T& value2) | 返回两个值中的最小值 |
qint64 qRound64(qreal value) | 64位整型四舍五入函数 |
int qRound(qreal value) | 整型四舍五入函数 |
数据类
Qt提供基本数据类型的同时,为了在开发应用程序时能顺利操作数据,还提供了各种类。
QBitArray
QBitArray类提供了位数组,通过AND、OR、XOR、NOT执行为操作,从而减少不必要的位数据复制造成的内存浪费。
QBitArray类的初始化方法为:
QBitArray ba(200);
QBitArray可以重新调整数组大小。
QBitArray ba;
ba.resize(3);
ba[0] = true;
同样,QBitArray支持&(AND)、|(OR)、^(XOR)、~(NOT)运算。
提供的成员函数可通过false、true操作所有声明为QBitArray类的数组:
QBitArray ba(200);
ba.fill(true);
QBrush
QBrush类用于定义QPainter图形填充模式。一个笔刷(Brush)可以表现风格、颜色、斜度和质地。比如:
QPainter painter(this);
painter.setBrush(Qt::cyan);
painter.setPen(Qt::darkCyan);
painter.drawRect(0,0,100,100);
QByteArray
QByteArray类用于将字符串数据保存到字节数组,可以保存Raw数据和字符串(String)型(包括最后的'\0')的字节。与const char等字符常量想比,更简单易用。QByteArray在复制同一内存区域的字符串期间,会访问其它处理器,减少内存占用,从而高效使用内存。
因此,在嵌入式Linux平台使用QByteArray时,可提高内存的使用效率。
QByteArray类可将字符串保存到构造函数:
QByteArray ba("Hello");
除了使用构造函数存储字符串的方法外,还可以使用函数resize()动态分配大小:
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
可以使用at()函数读取数组中特定位置的数据:
for(int i=0;i<ba.size();i++){
if(ba.at(i)>='a'&&ba.at(i)<='f')
cout<<"Found in range [a-f]"<<endl;
}
QByteArray可以使字节数组包含字符串结束符'\0'。此时,如果利用函数size()返回数组字符串的整体大小,则其内不包含'\0'。
QByteArray ba1("ca\0r\0t");
qDebug()<<ba1.size(); //返回2
qDebug()<<ba1.constData();
QByteArray ba2("ca\0r\0t",3);
qDebug()<<ba2.size(); //返回3
qDebug()<<ba2.constData();
QByteArray ba3("ca\0r\0t",4);
qDebug()<<ba3.size(); //返回4
qDebug()<<ba3.constData();
const char cart[]={'c','a','\0','r','\0','t'};
QByteArray ba4(QByteArray::fromRawData(cart,6));
qDebug()<<ba4.size(); //返回6
qDebug()<<ba4.constData();
QByteArray提供的成员函数可以在字符串的前半部分或后半部分添加字符和字符串,并可更换特定位置的数据。
QByteArray x("and");
qDebug()<<x.prepend("rock "); //返回“rock and”
qDebug()<<x.append(" roll"); //返回"rock and roll"
qDebug()<<x.replace(5,3,"&"); //返回“rock & roll”
QByteArray可以解码(Decode)Base 64格式的数据,使用成员函数FromBase64()即可。
QByteArray text=QByteArray::fromBase64("UXQgaXMgZ3JlYXQh");
qDebug()<<text.data(); //返回Qt is great!
使用基于Base64编码(encode)的数据的算法使用的是RFC2045。此外,还可以改变保存为十六进制的数据,以及URL/URI格式输入的编码数据。
QByteArray text=QByteArray::fromHex("517420697320677265617421");
qDebug()<<text.data();
QByteArray text1=QByteArray::fromPercentEncoding("Qt%20is%20great%33");
qDebug()<<text1.data();
可以返回从字符串数组左边开始指定位置的数据。函数left()将指定的大小转换为参数:
QByteArray x("Pineapple");
QByteArray y=x.left(4);
qDebug()<<y; //返回“Pine”
此外,如果使用函数leftJustfied(),则可以使用从特定位置字符串之后开始指定的字符:
QByteArray x("apple");
QByteArray y=x.leftJustified(8,'.');
qDebug()<<y; //返回“apple...”
QByteArray还可以将储存的字符串数据变为int、float、long等类型的数据并保存。
QByteArray str("FF");
bool ok;
int hex=str.toInt(&ok,16);
int dec=str.toInt(&ok,10);
qDebug()<<hex<<dec;
QColor
QColor类提供基于RGB、HSV、CMYK的色彩值。换言之,除了用RGB(红绿蓝)构成颜色外,也会将HSV(色调、饱和度、亮度)和CMYK用作构成要素。
QColor主要使用RGB值。为了使用HSV和CMYK,可以使用函数toHsv()和toCmyk()进行转换。
QCursor
QCursor类可以将鼠标光标指定为任意形状。此类主要用于在特定控件上创建鼠标光标并设置位置。除标准鼠标光标形状外,还可以使用QBitmap、Mask、Hospot创建用户自定义的光标形状。
QDate
QDate类提供有关日期的功能。使用系统时钟(Clock)读取当前日期的年、月、日;QDate利用函数currentDate()读取当前时间,利用函数fromString()在字符中说明日期。
QDate类通过year()、mouth()和day()函数读取年、月、日,而且可以读取罗马字母格式的日期简称和全程。像给int型增加数字一样,利用函数addYears()、addMouths()和addDays()给当前日期的年、月、日增加参数值。
QDate类提供比较日期的功能:
QDate d1(1999,1,1);
QDate d2(2000,3,2);
qDebug()<<d1.daysTo(d2); //返回426
QDate类通过文本格式显示所有输入的字符,因此,显示日期的模式字符必须放在引号内输入:
QDate d1=QDate::fromString("02.25","MM.dd");
QString str=d1.toString("yyyy.MM.dd");
qDebug()<<str;
QFont
QFont类指定字体的属性,可以使用文字的字号、颜色、加粗、下划线、倾斜等属性。
QFont font("Times", 10, QFont::Bold);
QImage
QImage类可以访问图像等像素数据,提供与硬件无关的图像显示功能。Qt还提供了与QImage类功能类似的QPixmap、QBitmap、QPicture。
在这四个类中,QPixmap类在操作和显示图像方面功能最佳,而QImage类则在直接访问像素和连接并使用I/O方面表现不俗。
QKeySequence
QKeySequence类指定菜单快捷键,提供可快速执行菜单项目的用户界面。通过最常用的Ctrl键和字母的组合方式指定快捷键。
QKeySequence(tr("ctrl+P"));
QKeySequence(Qt::CTRL+Qt::Key_P);
QMargins
QMargins类指定举行4个区域的边距值,即左、上、下、右这4个区域。
利用函数setLeft()、setRight()、setTop()和setBottom()可以分别设置相应的边距值。
QUrl
QUrl类在使用URL的界面中很好用,它提供了多种功能以操作编码或未编码的URL。
QUrl url("www.lvchademiao.com/list of time");
qDebug()<<url.toEncoded();
qDebug()<<QUrl::fromEncoded("www.lvchademiao.com/list%20of%20time");
容器类
与STL相比,Qt提供的容器类使用起来更安全、更简单,而且都是轻量化的。因此Qt提供的容器类可以代替STL提供的容器类。
QHash<Key,T>
QHash类提供了基于散列表的字典。存储方式时键(Key)、值(Value)成对存储。通过键可以检索到要查的数据。QHash的功能虽然与QMap的功能非常类似,但其内部运算比QMap要更快。
为了通过键值使用QString且存储int,可进行如下声明:
QHash<QString,int> hash;
hash["one"]=1; //存值
hash.insert("seven",7); //存值
int num1=hash["one"]; //取值
int num2=hash.value("seven"); //取值
qDebug()<<num1<<num2;
QMultiHash<Key,T>
QMultiHash是继承自QHash的类,比QHash更适合存储多种散列值。虽然QHash不允许一键多值,但是QMultiHash却允许。因此QMultiHash提供了QHash扩大形态的类功能。
QMultiHash可以将存储为多值的项转换为QList的项:
QList<int> list=hash.values("number");
for(int i=0;i<list.size();i++){
qDebug()<<list.at(i);
}
QList<T>
QList<T>以列表形态存储并管理值,并能进行基于快速索引的访问,还可以快速删除数据。QList类的使用方法与QLinkedList、QVector类的使用方法类似。
QList是基于索引的类,比QLinkedList的迭代器使用起来更方便,存储数据时分配内存的速度比QVector快。
比较不一样的是QList使用运算符将内容添加到列表。
QList<QString> list;
list<<"one"<<"two"<<"three"; //向列表添加值
for(int i=0;i<list.size();i++){
if(list.at(i)=="two")
qDebug()<<list.at(i); //从列表取值
}
QLinkedList<T>
QLinkedList<T>类基于迭代器,可以插入和删除列表的项目。
QLinkedList<QString> list;
list<<"one";
list<<"two";
QVector<T>
QVector<T>作为容器类之一,可以快速存储相关项目到存储器的位置,并提供基于索引的快速访问。
QVector将项目存储到向量,一般在声明的同时分配向量大小:
QVector<QString> vector(20);
vector<<"one";
vector.append("two");
qDebug()<<vector.at(0);
vector[0]="three";
qDebug()<<vector.at(0);
当使用“<<”或者append()函数时,是在整个向量的末尾添加项目。
QStack<T>
QStack<T>是提供栈算法的类,其结构是后进先出(LIFO)。
QStack<int> stack;
stack.push(1); //入栈
stack.push(2);
while(!stack.isEmpty()){
qDebug()<<stack.pop(); //出栈
}
QQueue<T>
QQueue<T>类提供了队列算法的类,是先进先出的结构,与栈相反。
QQueue<int> queue;
queue.enqueue(1); //入队列
queue.enqueue(2);
while(!queue.isEmpty()){
qDebug()<<queue.dequeue(); //出队列
}
QSet<T>
QSet<T>是Qt容器类之一,保存结构没有指定顺序,故可以快速查找。QSet的内部结构由QHash实现。通过存储QString的方法可以实现初始化。
QSet<QString> set;
set.insert("one");
set<<"two";
字符串类
QByteArray
QByteArray类提供字节(8位)单位的数组,如下所示将字符数组存储到QByteArray中:
QByteArray ba("Qt");
qDebug()<<ba.size(); //返回2
利用成员函数size()获得字符数组的长度,尽管其中包含了字符串结束标志'\0',但是size()结果中并不显示出来。
为了添加和编辑QByteArray存储的字符数组,Qt提供了成员函数append()、prepend()、insert()、replace()、remove()等等函数。
QByteArrayMatcher
QByteArrayMatcher类在字节数组中查找匹配的字节数组模式。
QByteArray x("hello qt byebye"); //整体字符串
QByteArray y("qt"); //要寻找的字符串
QByteArrayMatcher matcher(y); //寻找器
qDebug()<<matcher.indexIn(x,0); //寻找匹配
QChar
用于支持16位Unicode字符的类。
QString str1="Hello Qt",str2;
QChar* data=str1.data();
while(!data->isNull()){
str2.append(data->unicode());
data++;
}
qDebug()<<str2; //输出“Hello Qt”
QString
QString类支持Unicode字符的字符串,可以存储16位QChar。
QString类可以使用%1、%2~%99的参数范围显示或存储字符串:
QString str=QString("Hello %1 , Byebye %2").arg("Qt").arg("WinForm");
qDebug()<<str;
QStringList
QStringList类继承自QList<QString>,可进行“<<”运算和大量的成员函数。
QStringMatcher
QStringMatcher类比较QString字符串,以查找对应的字符。
最终总结起来的部分,可以参考链接: QT数据类型和有用的数据操作类总结。