QIODevice 類是 Qt 中所有 I/O 設備的基接口類。 更多...
| 頭: |
#include <QIODevice>
|
| CMake: |
find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
|
| qmake: |
QT += core
|
| 繼承: | QObject and QIODeviceBase |
| 繼承者: |
QAbstractSocket , QBluetoothSocket , QBuffer , QCoapReply , QFileDevice , QLocalSocket , QNetworkReply , QProcess ,和 QSerialPort |
注意: 此類的所有函數 可重入 .
| 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 () |
| void | commitTransaction () |
| int | currentReadChannel () const |
| int | currentWriteChannel () const |
| QString | errorString () const |
| bool | getChar (char * c ) |
| bool | isOpen () const |
| bool | isReadable () const |
| virtual bool | isSequential () const |
| bool | isTextModeEnabled () const |
| bool | isTransactionStarted () const |
| bool | isWritable () const |
| virtual bool | open (QIODeviceBase::OpenMode mode ) |
| QIODeviceBase::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 () |
| int | readChannelCount () const |
| qint64 | readLine (char * data , qint64 maxSize ) |
| QByteArray | readLine (qint64 maxSize = 0) |
(從 6.9 起)
QByteArrayView
|
readLineInto (QSpan<char> buffer ) |
(從 6.9 起)
QByteArrayView
|
readLineInto (QSpan<std::byte> buffer ) |
(從 6.9 起)
QByteArrayView
|
readLineInto (QSpan<uchar> buffer ) |
(從 6.9 起)
bool
|
readLineInto (QByteArray * line , qint64 maxSize = 0) |
| virtual bool | reset () |
| void | rollbackTransaction () |
| virtual bool | seek (qint64 pos ) |
| void | setCurrentReadChannel (int channel ) |
| void | setCurrentWriteChannel (int channel ) |
| void | setTextModeEnabled (bool enabled ) |
| virtual qint64 | size () const |
| qint64 | skip (qint64 maxSize ) |
| void | startTransaction () |
| void | ungetChar (char c ) |
| virtual bool | waitForBytesWritten (int msecs ) |
| virtual bool | waitForReadyRead (int msecs ) |
| qint64 | write (const char * data , qint64 maxSize ) |
| qint64 | write (const QByteArray & data ) |
| qint64 | write (const char * data ) |
| int | writeChannelCount () const |
| void | aboutToClose () |
| void | bytesWritten (qint64 bytes ) |
| void | channelBytesWritten (int channel , qint64 bytes ) |
| void | channelReadyRead (int channel ) |
| void | readChannelFinished () |
| void | readyRead () |
| virtual qint64 | readData (char * data , qint64 maxSize ) = 0 |
| virtual qint64 | readLineData (char * data , qint64 maxSize ) |
| void | setErrorString (const QString & str ) |
| void | setOpenMode (QIODeviceBase::OpenMode openMode ) |
(從 6.0 起)
virtual qint64
|
skipData (qint64 maxSize ) |
| virtual qint64 | writeData (const char * data , qint64 maxSize ) = 0 |
QIODevice 為支持數據塊讀寫的設備提供公共實現和抽象接口,譬如 QFile , QBuffer and QTcpSocket 。QIODevice 是抽象的且無法被實例化,但通常使用它定義的接口以提供設備無關的 I/O 特徵。例如:Qt 的 XML 類運轉於 QIODevice 指針,允許它們與各種設備 (譬如:文件和緩衝) 一起使用。
在訪問設備之前, open () 必須被調用以設置正確 OpenMode (譬如 ReadOnly 或 ReadWrite)。然後可以寫入設備采用 write () 或 putChar (),和讀取通過調用 read (), readLine (),或 readAll ()。調用 close (),當設備用完時。
QIODevice 分 2 種類型的設備:隨機訪問設備和順序設備。
可以使用 isSequential () 確定設備類型。
QIODevice 發射 readyRead () 當有新數據可供讀取時;例如,若新數據到達網絡,或額外數據被追加到正讀取的文件中。可以調用 bytesAvailable () 以確定目前可供讀取的字節數。常用 bytesAvailable () 連同 readyRead () 信號當采用異步設備編程時,譬如 QTcpSocket ,數據片段可以在任意時間點到達。QIODevice 發射 bytesWritten () 信號,每當把數據負載寫入設備時。使用 bytesToWrite () 以確定當前等待寫入的數據量。
QIODevice 的某些子類,如 QTcpSocket and QProcess , 是異步的。這意味著 I/O 函數,譬如 write () 或 read () 總是立即返迴,而與設備本身的通信則可能發生,當控製返迴給事件循環時。QIODevice 提供的函數允許強製立即履行這些操作,同時阻塞調用綫程且不進入事件循環。這允許 QIODevice 子類在沒有事件循環的情況下 (或在單獨綫程中) 使用:
從主 GUI 綫程調用這些函數可能導緻用戶界麵被凍結。範例:
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 的子類隻要求實現保護 readData () 和 writeData () 函數。QIODevice 使用這些函數以實現其所有方便函數,譬如 getChar (), readLine () 和 write ()。QIODevice 還為您處理訪問控製,所以可以安全地假定設備以寫入模式打開,若 writeData () 被調用。
某些子類,譬如 QFile and QTcpSocket ,使用內存緩衝實現數據的中間體存儲。這減少瞭要求設備的訪問調用 (經常非常慢) 數。緩衝使函數像 getChar () 和 putChar () 很快,因為它們可以運轉於內存緩衝,而不是直接運轉於設備本身。不管怎樣,某些 I/O 操作不能很好的操控緩衝。例如,若多個用戶打開同一設備並逐字符讀取,它們最終可能讀取相同數據,當它們打算讀取各單獨組塊時。齣於此原因,QIODevice 允許繞過任何緩衝通過將 Unbuffered 標誌傳遞給 open ()。當子類化 QIODevice 時,記得繞過可以使用的任何緩衝,當設備以 Unbuffered 模式打開時。
通常,來自異步設備的傳入數據流是碎片化的,且數據組塊可以在任意時間點到達。要處理數據結構的不完整讀取,使用事務機製實現通過 QIODevice。見 startTransaction () 和相關函數瞭解更多細節。
某些順序設備支持憑藉多個通道的通信。這些通道錶示擁有獨立順序交付特性的單獨數據流。設備被打開後,就可以確定通道數通過調用 readChannelCount () 和 writeChannelCount () 函數。要在通道之間切換,調用 setCurrentReadChannel () 和 setCurrentWriteChannel (),分彆。QIODevice 還提供額外信號以處理基於每通道的異步通信。
另請參閱 QBuffer , QFile ,和 QTcpSocket .
[since 6.9]
QByteArrayView
QIODevice::
readLineInto
(
QSpan
<
char
>
buffer
)
[since 6.9]
QByteArrayView
QIODevice::
readLineInto
(
QSpan
<
std::byte
>
buffer
)
[since 6.9]
QByteArrayView
QIODevice::
readLineInto
(
QSpan
<
uchar
>
buffer
)
把來自此設備的行讀取到 buffer ,和返迴子集化的 buffer 包含讀取的數據。
若 buffer 's size is smaller than the length of the line, only the characters that fit within buffer are read and returned. In this case, calling readLineInto () again will retrieve the remainder of the line. To determine whether the entire line was read, first check if the device is atEnd (), in case the last line didn't end with a newline. If not atEnd (), verify whether the returned view ends with '\n'. Otherwise, another call to readLineInto () is required.
The resulting line can have trailing end-of-line characters ("\n" or "\r\n"), so calling QByteArrayView::trimmed () may be necessary.
In case an error occurred, this function returns a null QByteArrayView . Otherwise it is a sub-span of buffer . If no data was currently available for reading or the device is atEnd (), this function returns an empty QByteArrayView .
Note that the return value is not null terminated. If you want null-termination, you can pass
buffer.chopped(1)
and then insert '\0' at
buffer[result.size()]
.
這些函數在 Qt 6.9 引入。
另請參閱 readLine ().
構造 QIODevice 對象。
[explicit]
QIODevice::
QIODevice
(
QObject
*
parent
)
構造 QIODevice 對象采用給定 parent .
[virtual noexcept]
QIODevice::
~QIODevice
()
析構函數是虛擬的,且 QIODevice 是抽象基類。此析構函數不調用 close (),但子類析構函數可能會。若有疑問,調用 close () 之後銷毀 QIODevice .
[signal]
void
QIODevice::
aboutToClose
()
此信號被發射當設備即將關閉時。連接此信號,若需要履行操作在設備關閉之前 (如:若在需要寫入設備的單獨緩衝中有數據)。
[virtual]
bool
QIODevice::
atEnd
() const
返迴
true
若當前讀寫位置在設備的末端 (即:設備中沒有更多可供讀取的數據);否則返迴
false
.
對於某些設備,atEnd() 可以返迴 true 即使有更多數據要讀取。此特殊情況僅適用於設備生成數據以直接響應調用
read
() (如,
/dev
or
/proc
文件在 Unix 和 macOS,或控製颱輸入 /
stdin
在所有平颱)。
另請參閱 bytesAvailable (), read (),和 isSequential ().
[virtual]
qint64
QIODevice::
bytesAvailable
() const
返迴可供讀取的可用字節數。此函數通常用於順序設備,以確定在讀取之前緩衝中分配的字節數。
重實現此函數的子類必須調用基實現為包括緩衝大小對於 QIODevice 。範例:
qint64 CustomDevice::bytesAvailable() const { return buffer.size() + QIODevice::bytesAvailable(); }
另請參閱 bytesToWrite (), readyRead (),和 isSequential ().
[virtual]
qint64
QIODevice::
bytesToWrite
() const
對於緩衝設備,此函數返迴等待寫入的字節數。對於沒有緩衝的設備,此函數返迴 0。
重實現此函數的子類必須調用基實現為包括緩衝大小對於 QIODevice .
另請參閱 bytesAvailable (), bytesWritten (),和 isSequential ().
[signal]
void
QIODevice::
bytesWritten
(
qint64
bytes
)
此信號發射,每當把數據負載寫入設備的當前寫入通道時。 bytes 自變量是在此負載中寫入的設置字節數。
bytesWritten() 不會遞歸發射;若重新進入事件循環或調用 waitForBytesWritten () 在連接到 bytesWritten() 信號的槽內,信號不會被重新發射 (盡管 waitForBytesWritten () 可能仍返迴 true)。
另請參閱 readyRead ().
[virtual]
bool
QIODevice::
canReadLine
() const
返迴
true
若可以從設備讀取完整數據行;否則返迴
false
.
注意:沒有辦法確定是否可以讀取的無緩衝設備始終返迴 false。
此函數經常被調用結閤 readyRead () 信號。
重實現此函數的子類必須調用基實現以便包括內容為 QIODevice 的緩衝。範例:
bool CustomDevice::canReadLine() const { return buffer.contains('\n') || QIODevice::canReadLine(); }
另請參閱 readyRead () 和 readLine ().
[signal]
void
QIODevice::
channelBytesWritten
(
int
channel
,
qint64
bytes
)
此信號發射,每當把數據負載寫入設備時。 bytes 自變量設置此負載要寫入的字節數,而 channel 是它們要寫入的通道。不像 bytesWritten (),它被發射不管 當前寫入通道 .
channelBytesWritten() 可以被遞歸發射 - 即使是同一通道。
另請參閱 bytesWritten () 和 channelReadyRead ().
[signal]
void
QIODevice::
channelReadyRead
(
int
channel
)
此信號被發射當有新數據可用於從設備讀取時。 channel 自變量設置已到達數據的讀取通道索引。不像 readyRead (),它被發射不管 當前讀取通道 .
channelReadyRead() 可以被遞歸發射 - 即使是同一通道。
另請參閱 readyRead () 和 channelBytesWritten ().
[virtual]
void
QIODevice::
close
()
首先發射 aboutToClose (),然後關閉設備並將其 OpenMode 設為 NotOpen。還會重置錯誤字符串。
另請參閱 setOpenMode () 和 QIODeviceBase::OpenMode .
完成讀取事務。
對於順序設備,在事務期間記錄在內部緩衝的所有數據將被丟棄。
另請參閱 startTransaction () 和 rollbackTransaction ().
返迴當前讀取通道的索引。
另請參閱 setCurrentReadChannel (), readChannelCount (),和 QProcess .
返迴當前寫入通道的索引。
另請參閱 setCurrentWriteChannel () 和 writeChannelCount ().
返迴人類可讀的最後發生的設備錯誤描述。
另請參閱 setErrorString ().
從設備讀取 1 字符並把它存儲在
c
。若
c
is
nullptr
,字符被丟棄。返迴
true
當成功時;否則返迴
false
.
另請參閱 read (), putChar (),和 ungetChar ().
返迴
true
若設備是打開的;否則返迴
false
。設備是打開的若可以讀/寫。默認情況下,此函數返迴
false
if
openMode
() 返迴
NotOpen
.
另請參閱 openMode () 和 QIODeviceBase::OpenMode .
返迴
true
若可以從設備讀取數據;否則返迴 false。使用
bytesAvailable
() 以確定可以讀取多少字節。
這是方便函數,用於校驗設備 OpenMode 是否包含 ReadOnly 標誌。
[virtual]
bool
QIODevice::
isSequential
() const
返迴
true
若此設備是順序的;否則返迴 false。
與隨機訪問設備相反,順序設備沒有開始、結束、大小或當前位置的概念,且它們不支持尋址。纔可以從設備讀取數據,僅當設備報告數據可用時。順序設備的最常見範例是網絡套接字。在 Unix,特殊文件 (譬如 /dev/zero 和 fifo 管道) 是順序的。
另一方麵,常規文件確實支持隨機訪問。它們擁有大小和當前位置,且它們還支持在數據流中嚮後和嚮前尋址。常規文件是非順序的。
另請參閱 bytesAvailable ().
返迴
true
若
文本
標誌被啓用;否則返迴
false
.
另請參閱 setTextModeEnabled ().
返迴
true
若事務在設備上正在進行中,否則
false
.
另請參閱 startTransaction ().
返迴
true
若可以把數據寫入設備;否則返迴 false。
這是方便函數,用於校驗設備 OpenMode 是否包含 WriteOnly 標誌。
[virtual]
bool
QIODevice::
open
(
QIODeviceBase::OpenMode
mode
)
打開設備並將其 OpenMode 設為
mode
。返迴
true
若成功;否則返迴
false
。應該從 open() 或打開設備的其它函數的任何重實現調用此函數。
另請參閱 openMode () 和 QIODeviceBase::OpenMode .
返迴設備被打開的模式;即:ReadOnly 或 WriteOnly。
另請參閱 setOpenMode () 和 OpenMode .
讀取最多 maxSize 字節從設備到 data ,無副作用 (即:若調用 read () 在 peek() 之後,將獲得相同數據)。返迴讀取字節數。若發生錯誤 (譬如:當試圖窺視以 WriteOnly 模式打開的設備時),此函數返迴 -1。
返迴 0,當沒有更多數據可供讀取時。
範例:
bool isExeFile(QFile *file) { char buf[2]; if (file->peek(buf, sizeof(buf)) == sizeof(buf)) return (buf[0] == 'M' && buf[1] == 'Z'); return false; }
另請參閱 read ().
窺視最多 maxSize 字節從設備,返迴窺視數據作為 QByteArray .
範例:
bool isExeFile(QFile *file) { return file->peek(2) == "MZ"; }
此函數沒有辦法報告錯誤;返迴空 QByteArray 可能意味著當前沒有數據可供窺視,或發生錯誤。
這是重載函數。
另請參閱 read ().
[virtual]
qint64
QIODevice::
pos
() const
對於隨機訪問設備,此函數返迴要寫入或讀取數據的位置。對於沒有當前位置概念的順序設備或閉閤設備,返迴 0。
設備的當前讀/寫位置的內部維護由 QIODevice ,因此重實現此函數不必要。當子類化 QIODevice ,使用 QIODevice::seek () 來通知 QIODevice 關於設備位置的變化。
另請參閱 isSequential () 和 seek ().
寫入字符
c
到設備。返迴
true
當成功時;否則返迴
false
.
另請參閱 write (), getChar (),和 ungetChar ().
讀取最多 maxSize 字節從設備到 data ,並返迴讀取字節數。若發生錯誤,譬如試圖讀取以 WriteOnly 模式打開的設備,此函數返迴 -1。
返迴 0 當沒有更多可供讀取的數據時。無論如何,認為讀取流的末尾是錯誤的,所以,在此情況 (即:在關閉的套接字上讀取,或在進程已死亡之後讀取) 下,此函數返迴 -1。
另請參閱 readData (), readLine (),和 write ().
讀取最多 maxSize 字節從設備,並把讀取數據返迴作為 QByteArray .
此函數沒有辦法報告錯誤;返迴空 QByteArray 可以意味著目前沒有數據可供讀取,或發生錯誤。
這是重載函數。
從設備讀取所有剩餘數據,並將其作為字節數組返迴。
此函數沒有辦法報告錯誤;返迴空 QByteArray 可能意味著目前沒有可用於讀取的數據 (或齣現錯誤)。此函數也沒有辦法指示,可能有更多數據可用且無法讀取。
返迴可用的讀取通道數若設備是打開的;否則返迴 0。
另請參閱 writeChannelCount () 和 QProcess .
[signal]
void
QIODevice::
readChannelFinished
()
此信號被發射當關閉此設備的輸入 (讀取) 流時。一檢測到關閉就盡快發齣它,這意味著可能仍有數據可供讀取采用 read ().
[pure virtual protected]
qint64
QIODevice::
readData
(
char
*
data
,
qint64
maxSize
)
讀取到 maxSize 字節從設備到 data ,並返迴讀取字節數;返迴 -1 若發生錯誤。
若沒有字節要讀取且從不會有更多字節可用 (範例包括:套接字被關閉、管道被關閉、子進程已完成),此函數返迴 -1。
此函數被調用通過 QIODevice 。重實現此函數,當創建子類為 QIODevice .
當重實現此函數時,此函數在返迴之前讀取所有要求數據是很重要的。這是必需的為 QDataStream 能夠運轉於類。 QDataStream 假定讀取瞭所有請求信息,因此,不會試著讀取 (若存在問題)。
可以在 maxSize 為 0 的情況下調用 此函數,用於履行讀取後操作。
另請參閱 read (), readLine (),和 writeData ().
此函數從設備讀取一行 ASCII 字符,直到最多 maxSize - 1 字節,將字符存儲在 data ,並返迴讀取字節數。若無法讀取行但未發生錯誤,此函數返迴 0。若發生錯誤,此函數返迴可以讀取的內容長度,或 -1 若什麼都未讀取。
終止 \0 字節始終被追加到 data ,所以 maxSize 必須大於 1。
讀取數據直到滿足以下任一條件:
例如,以下代碼從文件讀取一行字符:
QFile file("box.txt"); if (file.open(QFile::ReadOnly)) { char buf[1024]; qint64 lineLength = file.readLine(buf, sizeof(buf)); if (lineLength != -1) { // the line is available in buf } }
The newline character ('\n') is included in the buffer. If a newline is not encountered before maxSize - 1 bytes are read, a newline will not be inserted into the buffer.
注意: Newline translation(e.g., converting \r to \n) is performed only when the device is opened for reading with QIODevice::Text flag.
注意:對於順序設備,數據可能不會立即可用,這可能導緻返迴部分行。通過調用 canReadLine () 函數在讀取之前,可以校驗是否能讀取完整行 (包括換行符)。
此函數調用 readLineData (),這的實現是使用重復調用對 getChar ()。可以提供更高效實現通過重實現 readLineData () 在自己的子類中。
另請參閱 getChar (), read (), canReadLine (),和 write ().
從設備讀取行,但不超過 maxSize 字符,並以字節數組形式返迴結果。
若 maxSize 為 0 或未指定,行可以是任意長度,從而啓用無限讀取。
The resulting line can have trailing end-of-line characters ("\n" or "\r\n"), so calling QByteArray::trimmed () may be necessary.
此函數沒有辦法報告錯誤;返迴空 QByteArray 可以意味著目前沒有數據可供讀取,或發生錯誤。
這是重載函數。
[virtual protected]
qint64
QIODevice::
readLineData
(
char
*
data
,
qint64
maxSize
)
讀取到 maxSize 字符到 data 並返迴讀取的字符數。
此函數被調用通過 readLine (),並提供其基實現,使用 getChar ()。緩衝設備可以改善性能對於 readLine () 通過重實現此函數。
readLine () 追加 \0 字節到 data ;readLineData() 不需要這樣做。
若重實現此函數,小心返迴正確值:它應返迴在這一行中讀取的字節數 (包括終止換行符),或 0 若此時沒有行要讀取。若齣現錯誤,應返迴 -1,當且僅當沒有字節要讀取時。讀取超過 EOF 認為齣錯。
[since 6.9]
bool
QIODevice::
readLineInto
(
QByteArray
*
line
,
qint64
maxSize
= 0)
從設備讀取行,但不超過 maxSize 字符。並以字節數組形式把它存儲在 line .
注意:
從此設備讀取行,即使
line
is
nullptr
.
若 maxSize 為 0 或未指定,行可以是任意長度,從而啓用無限讀取。
The resulting line can have trailing end-of-line characters ("\n" or "\r\n"), so calling QByteArray::trimmed () may be necessary.
If no data was currently available for reading, or in case an error occurred, this function returns
false
並設置
line
to
empty
。否則返迴
true
.
Note that the contents of line before the call are discarded in any case but its capacity () is never reduced.
該函數在 Qt 6.9 引入。
另請參閱 readAll (), readLine (),和 QTextStream::readLineInto ().
[signal]
void
QIODevice::
readyRead
()
此信號被發射一次,每次有新數據可用於從設備當前讀取通道讀取時。它隻會在新數據可用時再發射一次,譬如:當新網絡數據負載到達網絡套接字時,或當新數據塊被追加到設備時。
readyRead() 不會遞歸發射;若重新進入事件循環或調用 waitForReadyRead () 在連接到 readyRead() 信號的槽內,信號不會被重新發射 (盡管 waitForReadyRead () 可能仍返迴 true)。
注意,開發者實現的類派生自 QIODevice :應始終發射 readyRead() 當有新數據到達時 (不要僅因為緩衝中仍有數據要讀取而發射它)。在其它條件下不要發射 readyRead()。
另請參閱 bytesWritten ().
[virtual]
bool
QIODevice::
reset
()
尋址隨機訪問設備輸入起始。成功返迴 true;否則返迴
false
(例如:若設備未被打開)。
注意,當使用 QTextStream 在 QFile ,調用 reset() 在 QFile 將不會有期望結果,因為 QTextStream 緩衝文件。使用 QTextStream::seek () 函數代替。
另請參閱 seek ().
迴滾讀取事務。
將輸入流還原到點對於 startTransaction () 調用。此函數常用於迴滾事務,當在提交事務之前檢測到讀取未完成時。
另請參閱 startTransaction () 和 commitTransaction ().
[virtual]
bool
QIODevice::
seek
(
qint64
pos
)
對於隨機訪問設備,此函數將當前位置設為 pos ,返迴 true 當成功時,或 false 若發生錯誤。對於順序設備,默認行為是産生警告並返迴 false。
當子類化 QIODevice ,必須在函數開始時調用 QIODevice::seek() 以確保完整性采用 QIODevice 的內置緩衝。
另請參閱 pos () 和 isSequential ().
設置當前讀取通道為 QIODevice 到給定 channel 。當前輸入通道用於函數 read (), readAll (), readLine (),和 getChar ()。它還確定哪個通道觸發 QIODevice 以發射 readyRead ().
另請參閱 currentReadChannel (), readChannelCount (),和 QProcess .
設置當前寫入通道為 QIODevice 到給定 channel 。當前輸齣通道用於函數 write (), putChar ()。它還確定哪個通道觸發 QIODevice 以發射 bytesWritten ().
另請參閱 currentWriteChannel () 和 writeChannelCount ().
[protected]
void
QIODevice::
setErrorString
(const
QString
&
str
)
將最後發生的設備錯誤的人類可讀描述設為 str .
另請參閱 errorString ().
[protected]
void
QIODevice::
setOpenMode
(
QIODeviceBase::OpenMode
openMode
)
將設備 OpenMode 設為 openMode 。調用此函數以設置打開模式,若設備打開後標誌有變化。
若 enabled 為 true,此函數設置 文本 標誌在設備;否則 文本 標誌被移除。此特徵很有用,對於提供自定義行尾處理的類而言在 QIODevice .
IO 設備應被打開,在調用此函數之前。
另請參閱 isTextModeEnabled (), open (),和 setOpenMode ().
[virtual]
qint64
QIODevice::
size
() const
對於打開的隨機訪問設備,此函數返迴設備的大小。對於打開的順序設備, bytesAvailable () 被返迴。
若設備是關閉的,返迴尺寸不會反映設備的實際大小。
另請參閱 isSequential () 和 pos ().
跳過直到 maxSize 字節從設備。返迴實際跳過字節數,或 -1 當齣錯時。
此函數不等待,且僅丟棄已可供讀取的數據。
若以文本方式打開設備,把行尾終止符轉換成 \n 符號並計為單個字節等同 read () 和 peek () 行為。
此函數適於所有設備,包括順序設備無法 seek ()。它被優化以跳過不想要的數據之後 peek () 調用。
對於隨機訪問設備,skip() 可用於從當前位置嚮前尋址。負數 maxSize 值是不允許的。
另請參閱 skipData (), peek (), seek (),和 read ().
[virtual protected, since 6.0]
qint64
QIODevice::
skipData
(
qint64
maxSize
)
跳過直到 maxSize 字節從設備。返迴實際跳過字節數,或 -1 當齣錯時。
此函數被調用通過 QIODevice 。考慮重實現它當創建子類化的 QIODevice .
基實現通過讀入虛設緩衝以丟棄數據。這很慢,但工作於所有設備類型。子類可以重實現此函數以改進這。
該函數在 Qt 6.0 引入。
另請參閱 skip (), peek (), seek (),和 read ().
在設備上啓動新的讀取事務。
在讀取操作的序列中,定義可還原點。對於順序設備,讀取數據將在內部被復製,以在讀取不完整的情況下允許還原。對於隨機訪問設備,此函數保存當前位置。調用 commitTransaction () 或 rollbackTransaction () 去完成事務。
注意: 嵌套事務不被支持。
另請參閱 commitTransaction () 和 rollbackTransaction ().
放置字符 c 迴到設備,並遞減當前位置除非位置為 0。此函數通常被稱為撤銷 getChar () 操作,譬如:當編寫迴溯剖析器時。
若 c 先前未從設備讀取,行為未定義。
注意: 此函數不可用,當事務正在進行時。
[virtual]
bool
QIODevice::
waitForBytesWritten
(
int
msecs
)
對於緩衝設備,此函數等待直到緩衝寫入數據負載已寫入設備且 bytesWritten () 信號已發射,或直到 msecs 毫秒已過去。若 msecs 為 -1,此函數不會超時。對於無緩衝設備,會立即返迴。
返迴
true
若數據負載已寫入設備;否則返迴
false
(即:若操作超時或發生錯誤)。
可以在沒有事件循環的情況下操作此函數。它很有用,當編寫非 GUI 應用程序和在非 GUI 綫程中履行 I/O 操作時。
若調用來自的槽有連接到 bytesWritten () 信號, bytesWritten () 不會重新發射。
重實現此函數能為自定義設備提供阻塞 API。默認實現什麼都不做,並返迴
false
.
警告: 從主 GUI 綫程調用此函數可能導緻用戶界麵被凍結。
另請參閱 waitForReadyRead ().
[virtual]
bool
QIODevice::
waitForReadyRead
(
int
msecs
)
阻塞直到有新的數據可供讀取且 readyRead () 信號已發射,或直到 msecs 毫秒已過去。若 msecs 為 -1,此函數不會超時。
返迴
true
若新數據可用於讀取;否則返迴 false (若操作超時或齣現錯誤)。
可以在沒有事件循環的情況下操作此函數。它很有用,當編寫非 GUI 應用程序和在非 GUI 綫程中履行 I/O 操作時。
若調用來自的槽有連接到 readyRead () 信號, readyRead () 不會重新發射。
重實現此函數能為自定義設備提供阻塞 API。默認實現什麼都不做,並返迴
false
.
警告: 從主 GUI 綫程調用此函數可能導緻用戶界麵被凍結。
另請參閱 waitForBytesWritten ().
寫入最多 maxSize 字符的數據從 data 到設備。返迴實際寫入字節數;或 -1,若發生錯誤。
寫入內容為 data 到設備。返迴實際寫入字節數;或 -1,若發生錯誤。
這是重載函數。
把數據從 8 位字符的零終止字符串寫入設備。返迴實際寫入字節數;或 -1,若發生錯誤。這相當於
... QIODevice::write(data, qstrlen(data)); ...
這是重載函數。
返迴可用寫入通道數,若設備是打開的;否則返迴 0。
另請參閱 readChannelCount ().
[pure virtual protected]
qint64
QIODevice::
writeData
(const
char
*
data
,
qint64
maxSize
)
寫入直到 maxSize 字節來自 data 到設備。返迴寫入字節數,或 -1 若發生錯誤。
此函數被調用通過 QIODevice 。重實現此函數,當創建子類為 QIODevice .
當重實現此函數時,此函數在返迴前寫入所有可用數據很重要。這是必需的為使 QDataStream 能夠運轉於類。 QDataStream 假定寫入瞭所有信息,因此,不會試著寫入 (若存在問題)。