QT QIODevice类

The QIODevice class is the base interface class of all I/O devices in Qt.

QIODevice为了支持读写块数据,提供了一个共同的实现和一个通用的接口,这些块数据如: QFile, QBuffer 和 QTcpSocket.
QIODevice是abstract不能instantiated, 但通常会用到它定义的接口,这些接口提供设备无关的I/O特性。例如Qt的XML类通过操作一个QIODevice 的指针,可以使用各种各样的设备(files,buffers等)。
在访问设备之前,必须先调用open(),并设置正确的OpenMode(such as ReadOnly or ReadWrite)。你可以用write(),putChar()来写入设备。也可以用read(),readLine()来读设备。使用完毕后调用close().
QIODevice distinguishes between two types of devices: random-access devices and sequential devices.
random-access devices(随机访问设备):support seeking to arbitrary positions using seek(). The current position in the file is available by calling pos(). QFile and QBuffer are examples of random-access devices.
sequential devices(顺序访问设备): don't support seeking to arbitrary positions. The data must be read in one pass. The functions pos() and size() don't work for sequential devices. QTcpSocket and QProcess are examples of sequential devices.
可以使用 isSequential()判断设备的类型

 QTcpSocket and QProcess是QIODevice的子类,是异步的,这意味着 I/O 函数 write() or read()的结果总是立即返回,然而,当控件返回到事件循环时,可能会发生与设备本身的通信。QIODevice提供函数在阻塞调用线程和不输入事件循环的同时,允许程序立即执行,这使得QIODevice的子类可以被使用,在没有循环事件或者是单线程的条件下:

waitForReadyRead()将阻塞线程直到数据到来。

waitForBytesWriten()将阻塞线程直到数据写入。

waitFor...()子类会实现相应的函数为了特殊的操作。比如QProcess 有个叫waitForStarted()的函数。它将会延迟调用的线程,直到那个process已经启动。

QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
    return false;

gzip.write("uncompressed data");

QByteArray compressed;
while (gzip.waitForReadyRead())
    compressed += gzip.readAll();

通过子类化QIODevice ,可以提供相同的接口为自己 I/O设备。QIODevice的子类仅需要实现protected的readData()和writeData(),QIODevice 用这些函数实现了其他方便使用的函数。例如getChar(),readLine()和write()。QIODevice 可以为你提供访问控制,如果你已经调用writeData()函数,就可以认为设备已打开。

一些子类,如QFile 和QTcpSocket,会使用内存缓冲区实现存储临时的数据,这将减少设备访问的次数,设备访问的效率很低。Buffering makes functions like getChar() and putChar() fast, as they can operate on the memory buffer instead of directly on the device itself.(当你在内存缓冲区中操作数据而不是和访问设备本身。

成员函数:

	QIODevice()
QIODevice(QObject * parent)
virtual	~QIODevice()
virtual bool	atEnd() const
virtual qint64	bytesAvailable() const
virtual qint64	bytesToWrite() const
virtual bool	canReadLine() const
virtual void	close()
QString	errorString() const
bool	getChar(char * c)
bool	isOpen() const
bool	isReadable() const
virtual bool	isSequential() const
bool	isTextModeEnabled() const
bool	isWritable() const
virtual bool	open(OpenMode mode)
OpenMode	openMode() const
qint64	peek(char * data, qint64 maxSize)
QByteArray	peek(qint64 maxSize)
virtual qint64	pos() const
bool	putChar(char c)
qint64	read(char * data, qint64 maxSize)
QByteArray	read(qint64 maxSize)
QByteArray	readAll()
qint64	readLine(char * data, qint64 maxSize)
QByteArray	readLine(qint64 maxSize = 0)
virtual bool	reset()
virtual bool	seek(qint64 pos)
void	setTextModeEnabled(bool enabled)
virtual qint64	size() const
void	ungetChar(char c)
virtual bool	waitForBytesWritten(int msecs)
virtual bool	waitForReadyRead(int msecs)
qint64	write(const char * data, qint64 maxSize)
qint64	write(const char * data)
qint64	write(const QByteArray & byteArray)

Signals:

void	aboutToClose()
void	bytesWritten(qint64 bytes)
void	readChannelFinished()
void	readyRead()

Protected Functions
virtual qint64	readData(char * data, qint64 maxSize) = 0
virtual qint64	readLineData(char * data, qint64 maxSize)
void	setErrorString(const QString & str)
void	setOpenMode(OpenMode openMode)
virtual qint64	writeData(const char * data, qint64 maxSize) = 0





你可能感兴趣的:(QT)