- class QIODevice#
《QIODevice》类是Qt中所有I/O设备的基接口类。更多…
继承自:
QSerialPort、QNetworkReply、QLocalSocket、QAbstractSocket、QUdpSocket、QTcpSocket、QProcess、QFileDevice、QSaveFile、QFile、QTemporaryFile、QSslSocket、QBuffer、QCoapReply、QCoapResourceDiscoveryReply、QBluetoothSocket概要#
方法#
def
__init__()def
errorString()def
getChar()def
isOpen()def
isReadable()定义
isWritable()定义
openMode()定义
peek()定义
putChar()定义
read()定义
readAll()定义
readLine()定义
skip()定义
ungetChar()定义
write()
虚拟方法#
定义
atEnd()定义
close()定义
open()定义
pos()定义
readData()定义
reset()定义
seek()定义
size()定义
skipData()定义
writeData()
信号#
注意
本文档可能包含从 C++ 自动翻译到 Python 的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译有任何问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 创建工单来告知我们。
详细描述#
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
QIODevice为支持读取和写入数据块的设备提供了一个共通实现和抽象接口,如QFile、QBuffer和 QTcpSocket。QIODevice是一个抽象类,不能被实例化,但常用于定义的接口来提供设备无关的 I/O 特性。例如,Qt 的 XML 类操作一个QIODevice指针,这使得它们可以与各种设备(如文件和缓冲区)一起使用。在访问设备之前,必须调用
open()来设置正确的 OpenMode(如 ReadOnly 或 ReadWrite)。然后您可以使用write()或putChar()向设备写入,通过调用read()、readLine()或readAll()进行读取。完成对设备的操作后,请调用close()。QIODevice区分两种类型的设备:随机访问设备和顺序设备。您可以使用
isSequential()函数来确定设备的类型。QIODevice在有新数据可供读取时发出readyRead()信号;例如,如果新数据已到达网络或如果已附加到您的文件的额外数据。您可以通过调用bytesAvailable()来确定当前可读的字节数。在异步设备(如QTcpSocket)编程中,常将bytesAvailable()与readyRead()信号一起使用,因为数据片段可能在任意时间点到达。每当向设备写入数据负载时,QIODevice就会发射bytesWritten()信号。使用bytesToWrite()来确定当前待写入的数据量。某些
QIODevice子类(如QTcpSocket和QProcess)是异步的。这意味着I/O函数,如write()或read(),总是立即返回,而与设备本身的通信可能发生在返回到事件循环时。QIODevice提供了一些函数,允许您强制这些操作立即执行,同时阻止调用线程并避免进入事件循环。这允许QIODevice子类在没有事件循环的情况下使用,或者在一个独立的线程中使用waitForReadyRead()- 此函数将暂停调用线程的操作,直到有新数据可供读取。waitForBytesWritten()- 此函数将暂停调用线程的操作,直到将一份数据写入设备。waitFor….() -
QIODevice子类实现了特定于设备的阻塞函数。例如,QProcess有一个名为waitForStarted()的函数,它暂停调用线程的操作,直到进程开始。
从主线程或GUI线程调用这些函数可能会导致您的用户界面冻结。示例
gzip = QProcess() gzip.start("gzip", QStringList() << "-c") if not gzip.waitForStarted(): return False gzip.write("uncompressed data") compressed = QByteArray() while gzip.waitForReadyRead(): compressed += gzip.readAll()
通过继承
QIODevice,您可以为自己的I/O设备提供相同的接口。只有继承自QIODevice的类需要实现受保护的readData()和writeData()函数。QIODevice使用这些函数来实现所有其便利函数,例如getChar()、readLine()和write()等等。QIODevice还会为您处理访问控制,因此在调用writeData()时,您可以安全地假设设备已以写入模式打开。某些子类,如
QFile和 QTcpSocket,使用内存缓冲区进行数据的中间存储。这降低了必须进行设备访问调用的次数,这些调用通常非常缓慢。缓冲区使得如getChar()和putChar()这样的函数变得更快,因为它们可以在内存缓冲区上操作,而无需直接在设备上操作。然而,某些I/O操作与缓冲区不兼容。例如,如果有多个用户打开相同的设备并逐个字符读取,他们可能最终读取的是同一数据,而他们本意是读取不同的数据块。因此,QIODevice允许您通过将无缓冲标志传递给open()来绕过任何缓冲区。当继承QIODevice时,请记住在以无缓冲模式打开设备时绕过早先可能使用的任何缓冲区。通常,来自异步设备的数据流是分Fragment化的,数据块可以在任意时间点到达。为了处理数据结构的不完整读取,请使用由
QIODevice实现的交易机制。请参阅startTransaction()和相关函数的更多详细信息。某些顺序设备支持通过多个通道进行通信。这些通道表示独立排序列的数据流。一旦设备被打开,可以通过调用
readChannelCount()和writeChannelCount()函数来确定通道数。要在通道之间切换,分别调用setCurrentReadChannel()和setCurrentWriteChannel()。此外,QIODevice还提供了额外的信号来按通道处理异步通信。使用给定的
parent构建一个QIODevice对象。- __init__()
构建一个
QIODevice对象。- aboutToClose()#
当设备即将关闭时,该信号被发出。如果您需要在设备关闭之前执行某些操作,请连接此信号(例如,如果您在单独的缓冲区中有数据需要写入设备)。
- atEnd()#
- 返回类型::
bool
当当前读/写位置位于设备末尾时(即设备上没有更多的数据可以读取),返回
true;否则返回false。对于某些设备,即使还有可读取的数据,atEnd() 方法也可能返回 true。这种情况仅适用于在你调用
read()方法时生成数据的设备(例如,Unix 和 macOS 上的/dev或/proc文件,或在所有平台的控制台输入/stdin)。- bytesAvailable()#
- 返回类型::
int
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
返回可读取的字节数。此函数通常与顺序设备一起使用,以确定在读取之前在缓冲区中分配的字节数。
重新实现此函数的子类必须调用基本实现,以包括
QIODevice的缓冲区大小。示例def bytesAvailable(self): return buffer.size() + QIODevice.bytesAvailable()
- bytesToWrite()#
- 返回类型::
int
对于缓冲设备,此函数返回等待写入的字节数。对于没有缓冲区的设备,此函数返回 0。
重新实现此函数的子类必须调用基本实现,以包括
QIODevice的缓冲区大小。- bytesWritten(bytes)#
- 参数::
bytes – int
每当向设备的当前写入通道中写入数据负载时,都会发射此信号。《
bytes》参数设置为在这个负载中写入的字节数。bytesWritten()不会递归发射;如果您重新进入事件循环或在连接到bytesWritten()信号的槽中调用《
waitForBytesWritten()》方法,则信号不会重新发射(尽管《waitForBytesWritten()》方法仍然可能返回true)。参见
- canReadLine()#
- 返回类型::
bool
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
如果可以从设备中读取到完整的数据行,则返回《
true》;否则返回《false》。请注意,无缓冲设备无法确定可以读取什么,因此始终返回false。
此函数常与《
readyRead()》信号一起调用。重新实现此函数的子类必须调用基类实现,以便包含《
QIODevice》的缓冲区内容。示例def canReadLine(self): return buffer.contains('\n') or QIODevice.canReadLine()
- channelBytesWritten(channel, bytes)#
- 参数::
channel – int
bytes – int
每当向设备写入数据负载时,都会发射此信号。《
bytes》参数设置为在这个负载中写入的字节数,而《channel》是他们写入的通道。与《bytesWritten()》不同,它会在不管《current write channel》的情况下发射。channelBytesWritten()可以递归发射 - 即使是对同一个通道。
- channelReadyRead(channel)#
- 参数::
channel – int
当设备出现可读取的新数据时,会发出该信号。
channel参数设置为已到达数据的读取通道索引。与readyRead()不同,它会无条件发出,而不管current read channel是否设置了。channelReadyRead() 可递归发出 - 即使是对同一通道。
- close()#
首先调用
aboutToClose(),然后关闭设备并将它的 OpenMode 设置为 NotOpen。错误字符串也被重置。参见
setOpenMode()OpenMode- commitTransaction()#
完成一个读取事务。
对于顺序设备,事务期间在内部缓冲区中记录的所有数据都将被丢弃。
- currentReadChannel()#
- 返回类型::
int
返回当前读取通道的索引。
- currentWriteChannel()#
- 返回类型::
int
返回当前写入通道的索引。
- errorString()#
- 返回类型::
str
返回最后发生的设备错误的可读描述。
- getChar()#
- 返回类型::
bool
从设备中读取一个字符并将其存储在
c中。如果c是None,则丢弃字符。成功时返回true;否则返回false。- isOpen()#
- 返回类型::
bool
如果设备打开,则返回
true;否则返回false。设备打开意味着它可以被读取或写入。默认情况下,如果openMode()返回NotOpen,则此函数返回false。参见
openMode()OpenMode- isReadable()#
- 返回类型::
bool
如果可以从设备中读取数据,则返回
true;否则返回false。使用bytesAvailable()来确定可以读取多少字节。这是一个便利函数,用于检查设备的OpenMode是否包含ReadOnly标志。
参见
openMode()OpenMode- isSequential()#
- 返回类型::
bool
如果此设备是顺序的,则返回
true;否则返回false。与随机访问设备相对,顺序设备没有起始、结束、大小或当前位置的概念,也不支持查找。只有在设备报告数据可用时,您才能从设备中读取。顺序设备最常见的例子是网络套接字。在Unix中,特殊文件如/dev/zero和fifo管道是顺序的。
另一方面,常规文件支持随机访问。它们既有大小,也有当前位置,还可以在数据流中向前和向后查找。常规文件是非顺序的。
- isTextModeEnabled()#
- 返回类型::
bool
如果启用
Text标志,则返回true;否则返回false。- isTransactionStarted()#
- 返回类型::
bool
如果设备上正在进行事务,则返回
true,否则返回false。- isWritable()#
- 返回类型::
bool
如果可以写入数据到设备,则返回
true,否则返回 false。这是一个便捷函数,用于检查设备的 OpenMode 是否包含 WriteOnly 标志。
参见
openMode()OpenMode- open(mode)#
- 参数::
mode –
OpenModeFlag组合- 返回类型::
bool
打开设备,并将其 OpenMode 设置为
mode。如果成功则返回true,否则返回false。应从任何 open() 或其他打开设备的函数的重实现中调用此函数。参见
openMode()OpenMode- openMode()#
- 返回类型::
OpenModeFlag组合
返回设备打开的模式;即 ReadOnly 或 WriteOnly。
参见
setOpenMode()OpenMode- peek(buffer, maxlen)#
- 参数::
buffer –
PyBuffermaxlen – int
- 返回类型::
int
- peek(maxlen)
- 参数::
maxlen – int
- 返回类型::
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
这是一个重载函数。
从设备中查看最多
maxSize字节的数据,将查看的数据作为QByteArray返回。示例
def isExeFile(file): return file.peek(2) == "MZ"
此函数没有错误报告的方式;返回空的
QByteArray可能意味着没有当前可供查看的数据,或者发生了错误。参见
- pos()#
- 返回类型::
int
对于随机访问设备,此函数返回数据写入或读取的位置。对于顺序设备或关闭的设备,其中不存在“当前位置”的概念,则返回 0。
设备的当前读写位置由
QIODevice内部维护,因此无需重新实现此函数。在继承QIODevice时,使用seek()来通知QIODevice设备位置的变化。- putChar(c)#
- 参数::
c – int
- 返回类型::
bool
将字符
c写入设备。成功时返回true;否则返回false。- read(buffer, maxlen)#
- 参数::
buffer –
PyBuffermaxlen – int
- 返回类型::
int
- read(maxlen)
- 参数::
maxlen – int
- 返回类型::
这是一个重载函数。
从设备读取最多
maxSize个字节,并将读取的数据作为QByteArray返回。此函数无法报告错误;返回空
QByteArray可能意味着没有可读数据,或者发生错误。- readAll()#
- 返回类型::
从设备读取所有剩余数据,并作为字节数组返回。
此函数无法报告错误;返回空
QByteArray可能意味着没有可读数据,或者发生错误。此函数也不能指示更多数据可能可用而无法读取。- readChannelCount()#
- 返回类型::
int
如果设备打开,则返回可用的读取通道数;否则返回0。
- readChannelFinished()#
此信号在输入(读取)流在此设备中关闭时发出。它会在检测到关闭操作后立即发出,这意味着还有可能使用
read()读取数据。- 抽象 readData(maxlen)#
- 参数::
maxlen – int
- 返回类型::
PyObject
从设备读取最多
maxSize字节到data中,返回读取的字节数或发生错误时返回-1。如果没有可读取的字节,并且永远不会有更多的字节可用(例如,套接字关闭、管道关闭、子进程结束),则此函数返回-1。
此函数由
QIODevice调用。在创建QIODevice的子类时实现此函数。在实现此函数时,重要的是在返回之前读取所有必要的数据。这是为了确保
QDataStream能够操作该类。QDataStream假定读取了所有请求的信息,因此如果有问题,则不会重试读取。此函数可能会以0作为最大值调用,这可以用于执行读取操作之后的操作。
- readLine(buffer, maxlen)#
- 参数::
buffer –
PyBuffermaxlen – int
- 返回类型::
int
- readLine([maxlen=0])
- 参数::
maxlen – int
- 返回类型::
这是一个重载函数。
从设备中读取一行,但不超过
maxSize个字符,并以字节数组的形式返回结果。此函数无法报告错误;返回空
QByteArray可能意味着没有可读数据,或者发生错误。- readLineData(maxlen)#
- 参数::
maxlen – int
- 返回类型::
PyObject
将最多
maxSize个字符读入到data中,并返回读取的字符数。该函数由
readLine()调用,并提供了其基本实现,使用getChar()。缓冲设备可以通过重写此函数来提高readLine()的性能。readLine()将一个 ‘\0’ 字节追加到data中;readLineData() 不需要这样做。如果你重写此函数,请特别注意返回正确的值:它应该返回读取的包含终止换行符的字符字节数,如果没有要读取的行,则返回 0。如果发生错误,只有在没有读取任何字节的情况下,才返回 -1。读取到文件末尾(EOF)被视为错误。
- readyRead()#
每当从设备的当前读渠道可读新数据时,都会发射此信号。它将仅在可读取新车载数据时再次发射,例如,当新的网络数据负载到达你的网络套接字,或者当你将新的数据块追加到你的设备时。
readyRead()不会递归发射;如果你在连接到readyRead()信号的槽内重新进入事件循环或调用
waitForReadyRead(),则信号不会再次发射(尽管waitForReadyRead()可能返回 true)。注意面向
QIODevice的类实现的开发者:你应该在新的数据到达时总是发射 readyRead()(不要仅在缓冲区中还有未读数据时发射它)。在其他条件下勿发射 readyRead()。- reset()#
- 返回类型::
bool
对随机访问设备求至输入的起始位置。成功时返回 true;否则返回
false(例如,如果设备未打开)。请注意,当在一个
QFile上使用QTextStream时,调用QFile的 reset() 方法不会有预期的结果,因为QTextStream缓存了文件。请使用seek()函数代替。参见
- rollbackTransaction()#
撤销读事务。
将输入流恢复到
startTransaction()调用的位置。此函数通常用于在提交事务之前发现读取不完整时回滚事务。- seek(pos)#
- 参数::
pos – int
- 返回类型::
bool
对于随机访问设备,此函数将当前位置设置为
pos,在成功时返回 true,在发生错误时返回 false。对于顺序设备,默认行为是生成警告并返回 false。当你从类
QIODevice继承时,你必须在函数开始时调用 QIODevice::seek() 来确保与其内置缓存的完整性。- setCurrentReadChannel(channel)#
- 参数::
channel – int
将该
QIODevice的当前读取通道设置为指定的channel。当前输入通道被函数read()readAll()readLine()和getChar()使用。它还确定哪个通道触发QIODevice发射readyRead()。- 设置 setCurrentWriteChannel(channel)#
- 参数::
channel – int
设置
QIODevice的当前写入通道为指定的channel。当前输出通道被函数write()和putChar()使用。它还确定哪个通道触发QIODevice发射bytesWritten()。- setErrorString(errorString)#
- 参数::
errorString – 字符串
将最后发生的设备错误的可读描述设置为
str。- setOpenMode(openMode)#
- 参数::
openMode – 结合
OpenModeFlag
将设备的OpenMode设置为
openMode。如果设备打开后标志更改,请调用此函数设置打开模式。参见
openMode()OpenMode- setTextModeEnabled(enabled)#
- 参数::
enabled – bool
如果
enabled为真,此函数将在设备上设置Text标志;否则将移除Text标志。此功能对于在QIODevice上进行自定义换行符处理的类很有用。在调用此函数之前应打开IO设备。
- size()#
- 返回类型::
int
对于打开随机访问设备,此函数返回设备的大小。对于打开顺序设备,返回
bytesAvailable()。如果设备关闭,返回的大小将不会反映设备的实际大小。
- skip(maxSize)#
- 参数::
maxSize – int
- 返回类型::
int
从设备中跳过多达
maxSize个字节。返回实际跳过的字节数,或在出错时返回-1。此函数不会等待,并且仅丢弃已可供读取的数据。
如果设备以文本模式打开,则将换行符终止符转换为‘\n’符号,并以单个字节的方式与
read()和peek()的行为一致。该函数适用于所有设备,包括那些不能调用
seek()的顺序设备。它经过优化,以跳过在调用peek()之后的不需要的数据。对于随机访问设备,可以使用 skip() 从当前位置向前查找。不允许负
maxSize值。- skipData(maxSize)#
- 参数::
maxSize – int
- 返回类型::
int
从设备中跳过多达
maxSize个字节。返回实际跳过的字节数,或在出错时返回-1。此函数由
QIODevice调用。在创建子类时,考虑重写它。基本实现通过将数据读入虚拟缓冲区来丢弃数据。这很慢,但适用于所有类型的设备。子类可以重写此函数来改进。
- startTransaction()#
在设备上启动新的读取事务。
在一系列读取操作中定义一个可恢复点。对于顺序设备,会内部复制读取数据,以便在不完整的读取情况下进行恢复。对于随机访问设备,此函数保存当前位置。调用
commitTransaction()或rollbackTransaction()以完成事务。- ungetChar(c)#
- 参数::
c – int
将字符
c放回到设备中,并递减当前位置,除非位置为0。此函数通常用于“撤销”getChar()操作,例如在编写回溯分析器时。如果
c之前没有被从设备中读取,则行为是未定义的。注意
在事务进行时,此函数不可用。
- waitForBytesWritten(msecs)#
- 参数::
msecs – int
- 返回类型::
bool
对于缓冲设备,此函数等待直到缓冲的已写数据已写入设备,并且已发出
bytesWritten()信号,或者直到msecs毫秒已通过。如果 msecs 是 -1,则此函数将不会超时。对于非缓冲设备,它将立即返回。如果已将数据有效负载写入设备,则返回
true;否则返回false(即如果操作超时或发生错误)。此函数可以在没有事件循环的情况下操作。当编写非GUI应用程序以及执行非GUI线程中的I/O操作时很有用。
如果从连接到
bytesWritten()信号的槽中调用,则不会重新发出bytesWritten()。重新实现此函数以提供自定义设备的阻塞API。默认实现不执行任何操作,并返回
false。- waitForReadyRead(msecs)#
- 参数::
msecs – int
- 返回类型::
bool
阻塞直到有可读数据,并且已发出
readyRead()信号,或者直到msecs毫秒已通过。如果 msecs 是 -1,则此函数将不会超时。如果存在可读新数据,则返回
true;否则返回 false(如果操作超时或发生错误)。此函数可以在没有事件循环的情况下操作。当编写非GUI应用程序以及执行非GUI线程中的I/O操作时很有用。
如果从连接到
readyRead()信号的槽中调用,则不会重新发出readyRead()。重新实现此函数以提供自定义设备的阻塞API。默认实现不执行任何操作,并返回
false。- write(data)#
- 参数::
data –
QByteArray- 返回类型::
int
这是一个重载函数。
将
data的内容写入设备。返回实际写入的字节数,或如果发生错误则返回-1。- writeChannelCount()#
- 返回类型::
int
如果设备已打开,则返回可用的写入通道数;否则返回0。
- 抽象 writeData(data, len)#
- 参数::
data – str
len – int
- 返回类型::
int
从
data写入最多maxSize字节的到设备。返回写入的字节数或如果发生错误则返回-1。此函数由
QIODevice调用。在创建QIODevice的子类时实现此函数。在重新实现此函数时,确保在返回之前此函数写入所有可用的数据非常重要。这是为了使
QDataStream能够对类进行操作。QDataStream假设所有信息已写入,因此如果有问题,则不会重试写入。