QT的容器类的说明.docx
- 文档编号:3198378
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:16
- 大小:26.09KB
QT的容器类的说明.docx
《QT的容器类的说明.docx》由会员分享,可在线阅读,更多相关《QT的容器类的说明.docx(16页珍藏版)》请在冰点文库上搜索。
QT的容器类的说明
QT的容器类的说明
(1)
SequentailContainers
QVector
QVector提供了[]运算符
QVector可以用<<运算符代替append()函数。
QVector中的基本类型及指针被初始化为0。
QLinkedList
QLinkedList不提供[]运算符,所以必须通过迭代器来对其进行遍历。
QList
综合了QVector
支持[]运算符
在头部或尾部的插入/删除操作很迅速,而尺寸在1000以下时,在中间的插入/删除操作也很迅速。
通常情况下,QList是最合适的通用型容器。
QStringList:
QList
QStack
容器中可以放置的类必须拥有defaultconstructor、copyconstructor和assignmentoperator(显式定义或由编译器生成)
注意,派生自QObject的类不符合上述要求,因为其不具备copyconstructor和assignmentoperator;解决方法是在容器中存储对象指针而不是对象本身。
容器中所存放的元素本身也可以是容器,即可以嵌套——不过需要注意将连续的尖括号用空格分隔开,以免编译器误认为>>运算符。
Iterator
Qt支持两种风格的迭代器——Java-style和STL-style
Java-style的迭代器更容易使用,而STL-style的迭代器可以同Qt和STL中的算法联合使用,更为强大。
Java-styleIterator
每个sequential容器类,都有两个Java-style的迭代器类型:
只读迭代器和读写迭代器。
在使用Java-style的迭代器时,要清楚的第一件事情就是:
迭代器并不直接指向容器中的元素,而是指向元素之前或之后的位置。
迭代器被初始化时指向容器中第一个元素之前;若迭代器的右侧有元素存在,hasNext()函数返回true;next()函数返回位于迭代器右侧的元素,并将迭代器向右方移动一个元素的位置;hasPrevious()和previous()函数执行反方向的操作。
remove()函数总是删除最近一次被跳过的那个元素。
setValue()函数总是对最近一次被跳过的那个元素执行更新操作
insert()函数在迭代器当前指向的位置处插入新元素,并将迭代器指向新元素及其后续元素之间的位置。
STL-styleIterator
每个sequential容器类,都有两个STL-style的迭代器类型:
Container
:
iterator和Container
:
const_iterator。
容器的begin()函数返回一个指向容器中头部元素的iterator,而end()返回指向容器中尾部元素之后位置的iterator;
在容器为空时,begin()和end()的结果相同。
通常通过调用isEmpty()来检查容器是否为空,而不是通过比较begin()和end()的结果。
可以对STL-style的iterator使用+、-、*这三个运算符,类似于指针的用法。
某些Qt函数的返回值是容器类;如果需要使用STL-style的迭代器来对这样的返回值进行遍历,必须保存返回值的一个副本,并在副本上完成遍历,否则会可能会导致所谓的"danglingiterator"。
注意,若使用java-style的只读迭代器,在这种情况下会隐式的完成复制的工作,保证迭代器总是在副本上进行遍历操作。
implicitsharing(copyonwrite)
Qt中的implicitsharing机制的美妙之处在于它鼓励程序员在返回对象时采用传值这种简明的方式而不是引用或指针。
STL与此相反,鼓励程序员使用non-const引用来传递vector以避免将函数返回值的复制开销。
Qt中所有的容器都采用了implicitsharing机制;此外很多其他类QByteArray,QBrush,QFont,QImage,QString也采用了该机制——这保证这些类在以传值方式进行传递时有很高的效率,无论是作为参数还是函数返回值。
在Qt提供的implicitsharing机制下,对vector或list执行只读操作时,采用at()而不是[]运算符是一个更好的选择。
类似的,尽可能的使用constBegin()和constEnd()以避免不必要的拷贝操作。
foreachsyntax
foreach在进入循环体时自动复制容器的副本并在此副本上进行迭代,因此如果迭代过程中有通过迭代器对容器的修改操作的话,并不会影响循环的进行,循环结束后容器的内容也不会发生变化。
当然,如果在foreach循环中直接使用[]运算符对容器进行写操作的话,容器内容自然会发生变化。
foreach中支持break和continue语句
AssociativeContainers
QMap
QMap中的key-value对是升序排列的
插入和删除操作中都可以使用[]运算符,其下标为key;为避免创建不必要的空值,推荐用vlaue()而不是[]从QMap中取值。
QMap
keys()&values()
QMap的特性是单值;QMultiMap
QHash
QHash提供的接口和QMap很相似
QHash
支持operator==,并且K可用全局函数qHash()来计算hashvalue
QHash通常是单值的,而QMultiHash则通过insertMulti()支持多值插入。
QCache
遍历associativecontainr的最简单方法是使用Java-style的迭代器
foreachsyntax也可用于assocaitivecontainer
GenericAlgorithms
头文件
STL头文件
qFind(),qBinaryFind(),qFill(),qCopy(),qSort(),qStableSorg(),qDeleteAll(),qSwap()
需要注意的是,qDeleteAll()只对包含指针的容器有意义,该函数将释放所有对象,但并不删除容器中的指针。
Strings,ByteArrays,andVariants
QString,QByteArray和QVariant这三个类和容器类有很多相似之处,在某些场合下可作为容器类的替代品;和容器类一样,这三个类也应用了implicitsharing机制
QString
QString中存放的是16-bit的Unicold值。
从概念上,QString可以看成是QVector
QString提供+/+=运算符以及append()函数用于合并字符串
QString提供的sprintf()函数,与C++标准库中的sprintf支持相同的参数格式。
QString提供的arg()函数,是比sprintf()更好的选择,因为它保证类型安全,支持unicode。
QString:
:
number():
number->string
QString:
:
setNum():
number->string
反向的转换接口:
toInt(),toLongLong(),toDouble()等,这些函数都有一个可选参数——bool类型的指针,若转换失败则将该bool变量置为true,否则置false.
mid()函数返回指定区间内的子串;left()和right()函数则分别返回左子串和右子串
QString的indexOf()函数可用于文本匹配,返回所匹配子串的起始下标;匹配失败时返回值为-1。
startsWith()和endsWith()函数可用于判断字符串的首部和尾部是否符合某种模式。
QString在进行比较时是大小写敏感的;当所比较的字符串是用户可见时,使用localeAwareCompare()通常是正确的选择。
toLower()&toUpper()
replace()&remove()&insert()
trimmed()&simplified()——这两个函数用于消去字符串中的whitesapce(spaces,tabs,newlines等)
QString:
:
split()将一个字符串分割为子串,并返回由这些子串们组成的一个QStringList。
QStringList中的所有元素可以通过join()函数组成一个新的字符串,join()的参数在合并时会被插入相邻元素中间。
在大多数情况下,由constchar*至QString的转换是自动的。
反方向的转换,可通过toAscii()或toLatin1()来完成;这些函数返回一个QByteArray,其可以通过QByteArray:
:
data或QByteArray:
:
constData()来转换为constchar*;
为了简化转换,Qt提供了一个qPrintable()宏用于完成与toAscii()以及constData()相同的操作。
QByteArray
QByteArray提供的API与QString的很相似。
QByteArray的用处在于存储原始2进制数据及8-bit编码的字符串。
通常选择QString而不是QByteArray来存储文本信息,因为QString支持Unicode。
QByteArray会自动在最后一个元素之后补上‘\0',这样使得将QByteArray传递给需要constchar*的函数变得很容易。
QByteArray支持'\0',允许存储任意的2进制数据。
QVariant
QVariant类可用于存放很多Qt类型的值,并且还可以存放容器。
QVariant在itemviewclass,databasemodel和QSetting中被广泛的使用着。
利用QVariant和嵌套,可以创建非常复杂的数据结构。
QVariant的便利性是以性能和代码的可读性为代价的。
QVariant被Qt的meta-objectsystem所使用,因此是Qtcoremodule的组成部分。
QVariant也可以支持用户自定义的数据类型,前提是该类型具有defalutconstructor和copyconstructor。
要实现对用户自定义类型的支持,需要使用宏Q_DECLARE来注册该类型。
全局函数:
qVariantFromValue(),qVariantValue
Chapter12Input/Output
Qt通过QIODevice类,对支持块读写的设备进行了强有力的抽象和封装,从而提供了良好的I/O支持。
Qt中提供的QIODevice的子类包括QFile,QTemperorayFile,QBuffer,QProcess,QTcpSocket和QUdpSocket.
QProcess,QTcpSocket和QUdpSocekt属于sequentialdevice,即数据只能被访问一次,且只能按照顺序读取;而QFile、QTemporaryFile和QBuffer属于random-accessdevice,数据可以被访问任意次,且可以从任意位置开始读取;
除了以上的deviceclass,Qt还提供了两个可用于读写任何设备的高层数据流类:
用于二进制数据的QDataStream和用于文本的QTextStream。
这两个类负责处理字节序和文本编码等问题,保证运行在不同平台或不同国家的Qt程序能正确读取彼此的文件。
这使得Qt的I/O类比起C++标准库中的I/O类更方便——它将这些问题留给了程序员来处理。
QProcess允许程序员调用外部程序并通过标准输入流、标准输出流和标准错误流与其进行通讯。
默认情况下,进程之间的通讯是异步的,但也可以在某些操作上阻塞。
ReadingandWritingBinaryData
Qt中载入和保存二进制数据最简单的方法就是使用QFile来打开文件,并通过QDataStream对象来访问文件内容。
QDataStream对象的versionnumber直接影响着Qt中的数据类型以何种方式表示和记录。
C++的基本类型保证总是以同一种方式表示和记录,不受versonnumber的影响。
在使用QDataStream时,需要保证在读文件和写文件时使用相同的numberversion。
若QDataStream被用来单纯读写C++基本类型的数据,那么没有必要调用setVersion()来设定versionnumber
QDataStream的默认字节序是big-endian,这可以通过调用setByteOrder()改变。
使用Qt时,通常没有必要显式执行关闭文件的操作,因为QFile在销毁的时候会自动执行文件的关闭操作。
可以调用flush()来强制完成数据的写操作。
QDataStream存储数据的方式能保证可以无缝的将其再次读出,例如,一个QByteArray对象的存放形式是一个32-bit的计数值后跟数据本身。
可以使用readRawData()和writeRawData()来读写原始字节。
使用QDataStream读数据时的错误处理是很简单的,status()函数返回当前状态,包括QDataStream:
:
Ok、QDataStream:
:
ReadPastEnd和QDataStream:
:
ReadCorruptData。
当有错误发生时,>>运算符的返回值总是0值或是空值。
为自定义类型提供>>和<<运算符有很多好处:
可以对包含该自定义类型的容器使用QDataStream;可以将该自定义类型的数据通过QVariant保存起来,这需要先调用qRegisterMetaTypeStreamOperators
如果希望一次性读/写文件,可以放弃QDataStream与QIODevice子类的联合使用,而用QIODevice提供的write()和readAll()接口来直接进行读写操作。
QIODevice()提供的peek()函数返回下一个待读取的数据,而不改变读写指针,该接口对于random-accessdevice和sequentaildevice都适用。
对于random-access,可以使用seek()来指定读写指针的位置。
ReadingandWrintingText
Qt提供了QTextStream来读写文本格式的文件,如plaintext,HTML,XML,sourcecode等。
QTextStream负责完成Unicode与系统本地编码之间的转换,并自动处理不同操作系统之间换行符不同表示方式上的转换(如在windows下是\r\n,在linux是\n)。
此外还自动完成C++基本数字类型与字符串之间的相互转换。
QTextStream使用QChar作为基本的数据单元。
写文本数据非常容易,然而读文本则可能非常具有挑战性,因为文本数据在本质上是具有歧义性的。
默认情况下,QTextStream使用本地编码来进行读写操作;可以调用setCodec()改变之,如stream.setCodec("UTF-8");
Qt仿照C++的I/O库为QTextStream也提供了streammanipulators。
同QDataStream一样,QTextStream在一个QIODevice之上进行操作;除此之外还可以在QString上进行操作,这种情况下不需要为流设置编码格式,因为QString总是Unicode。
如果只读写ASCII字符集和Latin-1字符集的文件,可以直接使用QIODevice提供的API进行读写,而不用使用QTextStream。
通常这并不是一个好主意,因为这不利于国际化和后期维护。
如果真的需要直接向QIODevice写文本,在使用open打开该QIODeveice时必须指定QIODevice:
:
Text标志;该标志的作用在于告知QIODevice,在写文本数据时,在windows平台上将所有\n转换为\r\n;而在读文本数据时,在所有平台上忽略\r。
TraversingDirectories
QDir提供了一种平台无关的方法用于获取文件信息以及遍历目录。
QDir:
:
entryList()其第二个参数表明要读取目录下的那些条目——文件(QDir:
:
Files)还是子目录(QDIr:
dirs)等。
QDir:
:
separator()返回当前平台上的目录分割符QDir在所有平台上都将'/'视为目录分割符,在windows平台上还额外的识别'\'。
QDir:
:
currentPath()返回程序当前目录的绝对路径
QDir:
:
homePath()返回用户的主目录路径
QFileInfo类允许程序员获取文件的属性信息,如大小,访问权限,所有者及各种时间戳等。
EmbeddingResources
Qt允许在程序的可执行文件中嵌入二进制或文本文件,这是通过Qt的资源机制实现的。
Inter-processCommunication
QProcess类允许运行外部程序并与其通讯。
该类异步工作,在后台完成相应的工作来保证UI对用户操作的正常响应,在外部程序终止或有数据产生时emitsignal来通知本程序。
QProcess:
:
start()用于传递必要的参数,并启动外部程序。
静态函数QProcess:
:
execute()会运行一个外部程序并在外部程序结束之前保持阻塞状态。
QTemporaryFile:
open()在无参数时以读写模式打开文件。
QTemporaryFile在对象生存期结束时会自动删除临时文件。
当QProcess以同步模式使用时,不需要建立signal-slot连接。
如果需要比静态函数execute()精度更高的控制,可以改用下面的方法:
首先创建一个QProcess对象,然后对其调用start(),之后调用QProcess:
:
waitForStarted()强制进入阻塞状态,直至外部程序顺利启动为止,之后再调用QProcess:
:
waitForFinished(),阻塞直至外部程序结束为止。
Chapter13Databases
QtSql模块提供了一个平台无关、数据库无关的访问SQL数据库的接口。
Qt中的每个数据库连接用一个QSqlDatabase对象来表示;Qt使用不同driver来和各种不同数据库的API进行通讯。
QSqlQuery提供了直接执行任意SQL语句的特性;此外还提供了两个高层次的无需SQL命令的数据库接口:
QSqlTableModel和QSqlRelationalTableModel
ConnectingandQuerying
在执行SQL命令前,必须先建立好同数据库的连接。
静态函数QSqlDatabase:
:
addDatabase()用于创建一个新的QSqlDatabase对象,函数的第一个参数指定了Qt该选择哪个Driver来访问数据库。
对QSqlDatabase对象设定好hostname,databasename,username和password后,需要调用open()函数建立到数据库的连接。
一旦到数据库的链接建立好后,就可以通过QSqlQuery:
:
exec()来执行底层数据库所支持的任意SQL语句了。
QSqlQuery:
:
next()返回查询结果集中的下一行,而QSqlQuery:
:
value()则返回当前行中的某一项的值,以QVariant的形式返回。
可以使用QSqlQuery:
:
isActive()来检查SQL语句的执行是否出现错误。
Placeholder
QSqlQuery:
prepare()
QSqlQuery:
:
bindValue()orQSqlQuery:
:
addBindValue()
QSqlQuery:
:
exec()
Qt支持数据库中transaction(事务)这个概念。
transaction()用于启动transaction,而commit()或rollback()用于结束transaction。
静态函数QSqlDatabase:
:
database(),返回指定连接所对应的QSqlDatabase对象。
QSqlDatabase:
:
driver()返回该连接底层所使用的dirver
QSqlDatabase:
:
hasFeature()可用来查询底层数据库是否支持某项特性。
Qt允许在一个程序中创建多个数据库连接,这种情况下在执行SQL语句时,需要为QSqlQuery对象的构造函数传入要执行该语句的数据库对应的QSqlDatabase对象。
与QSqlQuery相比,QSqlTableModel提供了一个更高层次、更抽象的接口,可以避免使用原始的SQL命令。
QSqlTableModel:
:
record()&QSqlTableModel:
:
value()
QSqlTableModel:
:
insertRow()&QSqlTableModel:
:
setData()
QSqlTableModel:
:
submitAll(),与其他model不同,在使用QSqlTableModel时,必须调用submitAll()来强制所有的修改都写入数据库。
当需要处理外键foreignkey时,需要使用QSqlRelationalTableModel而不是QSqlTableModel。
对于使用了SQL相关类的应用程序,需要在对应的.pro中添加下面一行:
"QT+=sql",这样在链接时会将QtSql库链入。
QT的容器类的说明
(2)
WrintingFTPClient
QFtp是Qt提供的封装了ftp协议的一个类。
Qftp的所执行的操作是异步完成的,这保证了FTP命令在执行过程中UI处于可相应状态。
当程序不需要链入QtGui库时,可以在main()中创建QCoreApplication对象而不是QApplication对象。
QCoreApplication:
:
argurments()函数以QStringList的形式返回程序的命令行参数,其中第一个参数为程序名,并且所有与Qt相关的参数例如-style都已经被移除掉了。
QUrl是Qt提供的一个用于从url中提取各种
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QT 容器 说明
![提示](https://static.bingdoc.com/images/bang_tan.gif)