QT开发(二十八)——QT常用类(二)

一、QDir

1QDir简介

    QDir提供对目录结构及其内容的访问。

    QDir通过相对或绝对路径指向一个文件。

2QDir成员函数

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

1QFile简介

QFile提供了读写文件的接口,是读写文本文件、二进制文件、资源文件的I/O设备。

QT4版本的QIODevice类图如下:

QT开发(二十八)——QT常用类(二)_第1张图片

    QT5版本的QIODevice类图如下:

QT开发(二十八)——QT常用类(二)_第2张图片

各个类的用途如下:

    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 获取

2QFile成员函数

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提供了文件系统中文件的名字与路径、访问权限和是否是目录或符号链接的信息。

2QFileInfo成员函数

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,包括QListQLinkedListQVectorQSetQHashQMap

    当在异步设备上使用数据流时,数据中的大部分都能在任意时间点到达。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

1QTextStream简介

    QTextStream为读写文本提供了实用接口。QTextStream可以操作QIODeviceQByteArray 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进制。

2QTextStream成员函数

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-1UTF-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