QT开发(二十八)——QT常用类(二)
一、QDir
1、QDir简介
QDir提供对目录结构及其内容的访问。
QDir通过相对或绝对路径指向一个文件。
2、QDir成员函数
QDir主要成员函数如下:
QDir::QDir ( const QDir & dir )
QDir::QDir ( const QString & path = QString() )
Dir::QDir ( const QString & path, const QString & nameFilter, SortFlags sort = SortFlags( Name | IgnoreCase ),Filters filters = AllEntries )
构造函数
QString QDir::absoluteFilePath ( const QString & fileName ) const
返回目录中文件的绝对路径
QString QDir::absolutePath () const
返回绝对路径,不包括.和..
bool QDir::cd ( const QString & dirName )
切换到目录
uint QDir::count () const
返回目录中文件和目录的数量
QDir QDir::current () [static]
返回应用程序的当前目录
QString QDir::currentPath () [static]
返回应用程序当前目录的绝对路径
QFileInfoList QDir::entryInfoList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const
QFileInfoList QDir::entryInfoList(Filters filters = NoFilter, SortFlags sort = NoSort) const
返回目录中所有文件与目录的QFileInfo对象链表
QStringList QDir::entryList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const
QStringList QDir::entryList(Filters filters = NoFilter,
SortFlags sort = NoSort) const
返回目录中所有文件与目录的名字的链表
bool QDir::exists(const QString & name) const
如果name文件存在返回true
bool QDir::exists() const
如果目录存在,返回true
bool QDir::isAbsolute() const
如果目录路径是绝对路径,返回true
bool QDir::isAbsolutePath(const QString & path) [static]
如果路径path是绝对路径,返回true
bool QDir::makeAbsolute()
将目录路径转化为绝对路径
bool QDir::mkdir(const QString & dirName) const
创建一个dirNanme的子目录
bool QDir::mkpath(const QString & dirPath) const
创建dirPath目录路径
void QDir::setSorting(SortFlags sort)
设置排序方式
void QDir::setFilter(Filters filters)
设置过滤器
bool QDir::setCurrent(const QString & path) [static]
将path设置为应用程序的当前工作目录
bool QDir::remove(const QString & fileName)
删除文件fileName
bool QDir::rename(const QString & oldName, const QString & newName)
将文件或目录oldName重命名为newName
bool QDir::rmdir(const QString & dirName) const
删除指定目录dirName
bool QDir::rmpath(const QString & dirPath) const
删除指定目录路径dirPath
二、QFile
1、QFile简介
QFile提供了读写文件的接口,是读写文本文件、二进制文件、资源文件的I/O设备。
QT4版本的QIODevice类图如下:
QT5版本的QIODevice类图如下:
各个类的用途如下:
QIODevice:所有 I/O 设备类的基类,提供了字节块读写的通用操作以及基本接口;
QFlie:访问本地文件或者嵌入资源;
QTemporaryFile:创建和访问本地文件系统的临时文件;
QBuffer:读写 QByteArray;
QProcess:运行外部程序,处理进程间通讯;
QAbstractSocket:所有套接字类的父类;
QTcpSocket:TCP 协议网络数据传输;
QUdpSocket:传输 UDP 报文;
QSslSocket:使用 SSL/TLS 传输数据;
QFileDevice:Qt5 新增加的类,提供了有关文件操作的通用实现。
QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备,QFile、QTemporaryFile和QBuffer是随机访问设备。QFile提供了从文件中读取和写入数据的能力,QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo 获取。
2、QFile成员函数
QFile主要成员函数如下:
QFile::QFile ( const QString & name )
QFile::QFile ( QObject * parent )
QFile::QFile ( const QString & name, QObject * parent )
构造函数
bool QFile::open ( OpenMode mode ) [virtual]
bool QFile::open ( FILE * fh, OpenMode mode )
bool QFile::open ( int fd, OpenMode mode )
打开文件
qint64 QFile::readData(char * data, qint64 len)[virtual protected]
qint64 QFile::readLineData(char * data, qint64 maxlen)[virtual protected]
读取数据
qint64 QFile::writeData(const char * data, qint64 len)[virtual protected]
写入数据
void QFile::close () [virtual]
关闭文件
bool QFile::copy(const QString & newName)
拷贝当前文件到newName文件
bool QFile::copy(const QString & fileName,const QString & newName)[static]
拷贝fileName文件到newName文件
bool QFile::exists ( const QString & fileName ) [static]
bool QFile::exists () const
文件是否存在
bool QFile::atEnd () const [virtual]
如果到达文件结束,返回true
QString QFile::fileName () const
返回文件名
bool QFile::remove ()
bool QFile::remove ( const QString & fileName ) [static]
删除文件
bool QFile::rename ( const QString & newName )
bool QFile::rename(const QString & oldName, const QString & newName)[static]
重命名文件
void QFile::setFileName ( const QString & name )
设置文件名
void QFile::setDecodingFunction ( DecoderFn function ) [static]
设置解码函数
void QFile::setEncodingFunction ( EncoderFn function ) [static]
设置编码函数
一、QFileInfo
1、QFileInfo简介
QFileInfo提供了独立与系统的文件信息。
QFileInfo提供了文件系统中文件的名字与路径、访问权限和是否是目录或符号链接的信息。
2、QFileInfo成员函数
QDir QFileInfo::absoluteDir() const
返回文件的绝对路径
QString QFileInfo::absoluteFilePath() const
返回包含文件名的文件的绝对路径
QString QFileInfo::absolutePath() const
返回不包含文件名的文件的绝对路径
QString QFileInfo::baseName() const
返回不带路径的文件的基本名字,不带任何文件后缀
QString QFileInfo::completeBaseName() const
返回不带路径的文件的完整基本名字,不带最后一个后缀
QString QFileInfo::completeSuffix() const
返回文件的完整后缀
QDateTime QFileInfo::created() const
返回创建文件的日期和时间
QDir QFileInfo::dir() const
返回对象的父目录的路径
QString QFileInfo::fileName() const
返回文件名,不包含路径
QString QFileInfo::filePath() const
返回包含路径的文件名
QString QFileInfo::path() const
返回不包括文件名的文件路径
qint64 QFileInfo::size() const
返回文件的大小
QString QFileInfo::suffix() const
返回文件的后缀
QString QFileInfo::symLinkTarget() const
返回符号链接指向的文件或目录的绝对路径
二、QDataStream
1、QDataStream简介
QDataStream 提供了基于 QIODevice 的二进制数据的序列化。数据流是一种二进制流,完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了Windows平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了Solaris的SPARC机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
QDataStream既能够存取C++基本类型,如int、char、short等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream 对于类的存储,是将复杂的类分割为很多基本单元实现的。
数据流和QIODevice紧密配合使用。QIODevice是读取数据和写入数据的输入输出中介。
写入二进制数据到流代码如下:
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
//串行化数据到到文件
QDataStream out(&file);
//串行输出一个字符串
out << QString("the answer is");
//串行输出一个整型
out << (qint32)42;
从流中读取二进制数据:
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
//从文件中串行化读取数据
QDataStream in(&file);
QString str;
qint32 a;
//从文件中读物字符串和整型
in >> str >> a;
当输入输出复杂类型时,确保读出流和写入流的版本相同是非常重要的。如果需要流操作的前后兼容,需要在应用程序在硬编码版本号。
stream.setVersion(QDataStream::Qt_4_0);
如果要生成新的二进制数据格式,如由应用程序创建的文档文件格式,可以使用QDataStream以兼容格式写入数据。通常,为了给程序未来扩展留有余地,可以写入包含魔术字符串和版本号的简要头信息。
QFile file("file.xxx");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
// Write a header with a "magic number" and a version
out << (quint32)0xA0B0C0D0;
out << (qint32)123;
out.setVersion(QDataStream::Qt_4_0);
// Write the data
out << lots_of_interesting_data;
读取数据的代码如下:
QFile file("file.xxx");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
// Read and check the header
quint32 magic;
in >> magic;
if (magic != 0xA0B0C0D0)
return XXX_BAD_FILE_FORMAT;
// Read the version
qint32 version;
in >> version;
if (version < 100)
return XXX_BAD_FILE_TOO_OLD;
if (version > 123)
return XXX_BAD_FILE_TOO_NEW;
if (version <= 110)
in.setVersion(QDataStream::Qt_3_2);
else
in.setVersion(QDataStream::Qt_4_0);
// Read the data
in >> lots_of_interesting_data;
if (version >= 120)
in >> data_new_in_XXX_version_1_2;
in >> other_interesting_data;
当串行化数据时,可以选择要使用的字节序。默认设置的字节序是大端。字节序设置为小端将会破坏兼容性,除非读取的时候也使用小端。除非有特殊需求,一般使用默认设置的字节序。
直接从流中读取原生二进制数据使用readRawData()函数,写入原生二进制数据到流使用writeRawData()函数,但数据的编解码必须自己完成。
与readRawData()函数不同,readBytes()函数读取一个quint32长度的数据到预分配的内存空间;writeBytes()写入quint32长度的数据。任何不同于quint32长度的数据的编解码必须自己完成。
QT容器类可以串行化到QDataStream,包括QList、QLinkedList、QVector、QSet、QHash和QMap。
当在异步设备上使用数据流时,数据中的大部分都能在任意时间点到达。QDataStream实现了使用一系列流操作符自动读取数据的事务机制。
2、QDataStream成员函数
QDataStream::QDataStream(QIODevice *d)
QDataStream::QDataStream(QByteArray *a, QIODevice::OpenMode mode)
QDataStream::QDataStream(const QByteArray &a)
构造函数
void QDataStream::abortTransaction()
中止一个读取事务
bool QDataStream::atEnd() const
如果IO设备到达文件或流的结束位置,返回true
ByteOrder QDataStream::byteOrder() const
返回当前字节序设置
bool QDataStream::commitTransaction()
返回一个读取事务,如果事务中没有发生读错误,返回true
QIODevice *QDataStream::device() const
返回当前设置的IO设备,如果没有设置,返回0
FloatingPointPrecision QDataStream::floatingPointPrecision() const
返回数据流的浮点精度
QDataStream &QDataStream::readBytes(char *&s, uint &l)
从流中读取缓冲区s,返回流的引用
int QDataStream::readRawData(char *s, int len)
从流中读取至多len字节到缓冲区s,返回读取的字节数,发生错误,返回-1
void QDataStream::resetStatus()
重置数据流的状态
void QDataStream::rollbackTransaction()
恢复一个读事务
void QDataStream::setByteOrder(ByteOrder bo)
设置串行化字节序到bo
void QDataStream::setDevice(QIODevice *d)
设置IO设备到d
void QDataStream::setFloatingPointPrecision(FloatingPointPrecision precision)
设置数据流的浮点精度到precision
void QDataStream::setStatus(Status status)
设置数据流的状态为给定状态status
void QDataStream::setVersion(int v)
设置数据串行化的版本到v
为了适应新的功能,在某些QT版本中,一些QT类数据流串行化格式已经做出了改变。如果想读取在早期QT版本创建的数据,或是写只有在早期QT版本编译的程序中才能读取的数据,需要修改数据流串行化格式。
int QDataStream::skipRawData(int len)
跳过设备中的len个字节,返回实际跳过的字节数
void QDataStream::startTransaction()
在流中启动一个新的读事务
Status QDataStream::status() const
返回数据流的状态
int QDataStream::version() const
返回数据串行化格式的版本号
QDataStream &QDataStream::writeBytes(const char *s, uint len)
写长度为len的缓冲区s到流,返回流的引用
int QDataStream::writeRawData(const char *s, int len)
从s中写len字节到流
五、QTextStream
1、QTextStream简介
QTextStream为读写文本提供了实用接口。QTextStream可以操作QIODevice、QByteArray 、QString数据。使用QTextStream的流操作符,可以方便读写字、行、数字。QTextStream支持字段填充、对齐的格式化选项和数字格式化。
QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream out(&data);
out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
// writes "Result: 3.14 2.7 "
}
通常使用QTextStream读取控制台输入和写入控制台输出。QTextStream支持本地化,会使用正确codec编×××自动解码标准输入。
QTextStream stream(stdin);
QString line;
while (stream.readLineInto(&line))
{
...
}
除了使用QTextStream构造函数,可以使用setDevice()或setString()设置流的设备或字符串。使用seek()函数定位位置,如果没有数据可读,atEnd()函数会返回true。
QTextStream在内使用基于Unicode编码的缓冲区,使用QTextCodec编译码器自动支持不同的字符集。默认,QTextCodec::codecForLocale()用于读写,但也能调用setCodec()设置编译码器。自动支持Unicode编码检测是默认行为,当读取的时候,QTextStream会检测UTF-16或是UTF-32 BOM并且自动选择合适的编×××。QTextStream默认不会以BOM方式写,但是可以调用setGenerateByteOrderMark(true)设置。QTextStream直接操作QString时,编译码器codec是失效的。
默认,从文本流中读取数字时,QTextStream会自动检测数字的进制。如果数字以0x开头会被假设为16进制;数字以1--9开头,会被假设为10进制。
2、QTextStream成员函数
QTextStream::QTextStream(QIODevice *device)
QTextStream::QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream::QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream::QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream::QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
构造函数
bool QTextStream::atEnd() const
流中不再有数据可读,返回true
bool QTextStream::autoDetectUnicode() const
如果自动Unicode检测打开,返回true
QTextCodec *QTextStream::codec() const
返回流的当前的编×××
QIODevice *QTextStream::device() const
返回流关联的当前设备
FieldAlignment QTextStream::fieldAlignment() const
返回当前的字段对齐方式
int QTextStream::fieldWidth() const
返回当前字段宽度
void QTextStream::flush()
刷新任何在等待的缓冲区数据,写入到设备
bool QTextStream::generateByteOrderMark() const
当使用UTF编×××时,如果流设置为UTF BOM,返回true
int QTextStream::integerBase() const
返回整数的进制
QLocale QTextStream::locale() const
返回命令设置语言环境,默认为C
QChar QTextStream::padChar() const
返回当前的填充字符
QString QTextStream::read(qint64 maxlen)
从流中读取至多len字节,返回读取的数据QString
QString QTextStream::readAll()
读取流中的所有内容
QString QTextStream::readLine(qint64 maxlen = 0)
从流中读取一行文本,返回的字符串不包含行结束符
允许行的最大长度为maxlen,如果maxlen为0,则为允许任何长度
void QTextStream::setCodec(QTextCodec *codec)
设置流的编×××为codec
void QTextStream::setCodec(const char *codecName)
设置流的编×××codec为指定名字codecName的编码,通常为ISO 8859-1、UTF-8、UTF-16
void QTextStream::setDevice(QIODevice *device)
设置当前设备到device,如果已经有设备,取代旧的设备
void QTextStream::setFieldAlignment(FieldAlignment mode)
设置字段对齐方式
void QTextStream::setFieldWidth(int width)
设置字段宽度
void QTextStream::setIntegerBase(int base)
设置整数进制
void QTextStream::setLocale(const QLocale &locale)
设置流的本地环境为locale
void QTextStream::setPadChar(QChar ch)
设置填充字符为ch
void QTextStream::setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
设置当前的字符串到string,打开方式为openMode
QString *QTextStream::string() const
返回流所赋值的字符串,如果没有字符串,返回0