QIODevice Class
QIODeviceクラスはQtの全てのI/Oデバイスの基本インターフェースクラスです。詳細...
Header: | #include <QIODevice> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Inherits: | QObject and QIODeviceBase |
Inherited By: | QAbstractSocket, QBluetoothSocket, QBuffer, QCoapReply, QFileDevice, QLocalSocket, QNetworkReply, QProcess, and QSerialPort |
- 継承メンバを含む全メンバ一覧
- QIODeviceは、Input/OutputおよびNetworkingに属しています。
注意:このクラスの関数は全てリエントラントです。
パブリック関数
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) |
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) |
(since 6.0) virtual qint64 | skipData(qint64 maxSize) |
virtual qint64 | writeData(const char *data, qint64 maxSize) = 0 |
詳細説明
QIODevice は、QFile 、QBuffer 、QTcpSocket のような、データ・ブロックの読み書きをサポートするデバイスのための共通の実装と抽象インターフェースの両方を提供します。QIODeviceは抽象的でインスタンス化することはできませんが、デバイスに依存しないI/O機能を提供するために、QIODeviceが定義するインターフェースを使用することは一般的です。例えば、QtのXMLクラスはQIODeviceポインタ上で動作し、様々なデバイス(ファイルやバッファなど)と使用することができます。
デバイスにアクセスする前に、open ()を呼び出して、正しいOpenMode(ReadOnlyやReadWriteなど)を設定する必要があります。その後、write ()またはputChar ()でデバイスに書き込み、read ()、readLine ()、readAll ()のいずれかを呼び出して読み取ることができる。デバイスの使用が完了したら、close() を呼び出します。
QIODeviceは、ランダム・アクセス・デバイスとシーケンシャル・デバイスの2種類のデバイスを区別する。
- ランダム・アクセス・デバイスは、seek() を使用して任意の位置へのシークをサポートする。ファイル内の現在位置は、pos ()を呼び出すことで確認できる。QFile とQBuffer は、ランダム・アクセス・デバイスの例である。
- シーケンシャル・デバイスは、任意の位置へのシークをサポートしていない。データは1回で読み込む必要がある。関数pos ()とsize ()は、シーケンシャル・デバイスでは動作しない。QTcpSocket とQProcess は、シーケンシャル・デバイスの例である。
isSequential() を使用すると、デバイスのタイプを判別できます。
QIODevice は、新しいデータが読み取り可能になるとreadyRead() を発行します。例えば、新しい データがネットワーク上に到着した場合や、読み取り元のファイルに追加データが追 加された場合などです。bytesAvailable() を呼び出せば、現在読み込み可能なバイト数を知ることができる。QTcpSocket のような非同期デバイスを使用するプログラミングでは、readyRead() シグナルとともにbytesAvailable() を使用するのが一般的です。QIODevice は、データのペイロードがデバイスに書き込まれるたびにbytesWritten() シグナルを送出します。bytesToWrite() を使用して、書き込み待ちの現在のデータ量を決定する。
QTcpSocket やQProcess など、QIODevice の特定のサブクラスは非同期です。つまり、write() やread() などの入出力関数は常に即座に戻りますが、デバイス自体との通信は、制御がイベント・ループに戻ったときに発生する可能性があります。QIODeviceは、呼び出し元のスレッドをブロックし、イベント・ループに入ることなく、これらの操作を強制的に即座に実行できる関数を提供します。これにより、QIODeviceサブクラスをイベント・ループなしで、または別のスレッドで使用することができます:
- waitForReadyRead() - この関数は、新しいデータが読み取り可能になるまで、呼び出し元のスレッドでの処理を一時停止します。
- waitForBytesWritten() - この関数は、1 つのペイロード・データがデバイスに書き込まれるまで、呼び出 しているスレッドの処理を一時停止します。
- waitFor...() - QIODevice のサブクラスは、デバイス固有の操作のためのブロッキング関数を実装します。例えば、QProcess にはwaitForStarted() という関数があり、プロセスが開始するまで呼び出し元のスレッドでの操作を一時停止します。
これらの関数をメインの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 やQTcpSocket などのいくつかのサブクラスは、データの中間的な格納にメモリ・バッファを使用して実装されています。これによって、必要なデバイス・アクセス・コールの回数が減ります。バッファリングにより、getChar() やputChar() のような関数は、デバイスそのものを直接操作するのではなく、メモリ・バッファを操作できるため、高速になる。しかし、ある種のI/O操作は、バッファではうまく動作しない。例えば、複数のユーザが同じデバイスを開いて1文字ずつ読み込む場合、それぞれ別のチャンクを読み込むつもりが、同じデータを読み込んでしまう可能性があります。このため、QIODeviceでは、open ()にUnbufferedフラグを渡すことで、バッファリングをバイパスすることができます。QIODeviceをサブクラス化するときは、デバイスがUnbufferedモードでオープンされているときに使用するバッファをバイパスすることを忘れないでください。
通常、非同期デバイスからの受信データ・ストリームは断片化されており、データの塊が任意の時点で到着する可能性があります。データ構造の不完全な読み取りを処理するには、QIODeviceによって実装されたトランザクション・メカニズムを使用します。詳細はstartTransaction() および関連関数を参照してください。
シーケンシャル・デバイスの中には、複数のチャネルを介した通信をサポートしているものがあります。これらのチャネルは、独立してシーケンス配信される特性を持つ、データの個別のストリームを表します。デバイスがオープンされると、readChannelCount() およびwriteChannelCount() 関数を呼び出すことで、チャネルの数を決定できる。チャンネルを切り替えるには、それぞれsetCurrentReadChannel() とsetCurrentWriteChannel() を呼び出します。QIODevice には、チャネルごとに非同期通信を処理するための追加シグナルも用意されています。
QBuffer 、QFile 、およびQTcpSocketも参照のこと 。
メンバ関数ドキュメント
QIODevice::QIODevice()
QIODevice オブジェクトを構築します。
[explicit]
QIODevice::QIODevice(QObject *parent)
与えられたparent で QIODevice オブジェクトを構築します。
[virtual noexcept]
QIODevice::~QIODevice()
デストラクタは仮想で、QIODevice は抽象ベース・クラスです。このデストラクタはclose() を呼び出しませんが、サブクラスのデストラクタは呼び出す可能性があります。疑わしい場合は、QIODevice を破棄する前にclose() を呼び出してください。
[signal]
void QIODevice::aboutToClose()
このシグナルは、デバイスが閉じようとするときに発せられます。デバイスが閉じる前に実行する必要がある操作がある場合(例えば、デバイスに書き込む必要がある別のバッファにデータがある場合)、このシグナルを接続してください。
[virtual]
bool QIODevice::atEnd() const
現在の読み取り/書き込み位置がデバイスの終端にある場合(つまり、デバイス上で読み取り可能なデータがもうない場合)はtrue
を返し、そうでない場合はfalse
を返す。
デバイスによっては、atEnd()は、読み込めるデータがまだあるにもかかわらず、true を返すことがある。この特殊なケースは、read() を呼び出したことに直接応答してデータを生成するデバイスにのみ適用される(例:UnixおよびmacOSの/dev
または/proc
ファイル、またはすべてのプラットフォームのコンソール入力 /stdin
)。
bytesAvailable()、read()、isSequential()も参照のこと 。
[virtual]
qint64 QIODevice::bytesAvailable() const
読み込み可能なバイト数を返す。この関数は、シーケンシャル・デバイスで、読み込み前にバッファに割り当てるバイト数を決定するためによく使用されます。
この関数を再実装するサブクラスは、QIODevice のバッファ・サイズを含めるために、基本実装を呼び出す必要があります:
bytesToWrite()、readyRead()、isSequential()も参照 。
[virtual]
qint64 QIODevice::bytesToWrite() const
バッファ付きデバイスの場合、この関数は書き込み待ちのバイト数を返す。バッファのないデバイスの場合、この関数は 0 を返します。
この関数を再実装するサブクラスは、QIODevice のバッファ・サイズを含めるために、基本実装を呼び出さなければならない。
bytesAvailable()、bytesWritten()、isSequential()も参照のこと 。
[signal]
void QIODevice::bytesWritten(qint64 bytes)
このシグナルは、デバイスの現在の書き込みチャネルにデータのペイロードが書き込まれるた びに発行される。bytes 引数には、このペイロードに書き込まれたバイト数が設定される。
bytesWritten()は再帰的に発行されないため、bytesWritten()シグナルに接続されたスロットの内部でイベント・ループに再入力したり、waitForBytesWritten()を呼び出したりしても、シグナルは再発行されない(ただし、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() とは異なり、このシグナルはcurrent write channel に関係なく発せられる。
channelBytesWritten()は、同じチャネルであっても、再帰的に呼び出すことができる。
bytesWritten() およびchannelReadyRead()も参照のこと 。
[signal]
void QIODevice::channelReadyRead(int channel)
このシグナルは、デバイスから新しいデータが読み出されたときに発せられる。引数channel には、データが到着した読み取りチャネルのインデックスが設定される。readyRead() とは異なり、このシグナルはcurrent read channel に関係なく発せられる。
channelReadyRead()は、同じチャネルであっても再帰的に呼び出すことができる。
readyRead() およびchannelBytesWritten()も参照 。
[virtual]
void QIODevice::close()
最初にaboutToClose() を発行し、デバイスを閉じて OpenMode を NotOpen に設定します。エラー文字列もリセットされる。
setOpenMode() およびQIODeviceBase::OpenModeも参照 。
void QIODevice::commitTransaction()
読み取りトランザクションを完了する。
シーケンシャル・デバイスの場合、トランザクション中に内部バッファに記録されたデータはすべて破棄される。
startTransaction() およびrollbackTransaction() も参照 。
int QIODevice::currentReadChannel() const
現在の読み取りチャネルのインデックスを返す。
setCurrentReadChannel()、readChannelCount()、QProcess も参照のこと 。
int QIODevice::currentWriteChannel() const
現在の書き込みチャネルのインデックスを返す。
setCurrentWriteChannel() およびwriteChannelCount() も参照 。
QString QIODevice::errorString() const
最後に発生したデバイス・エラーについて、人間が読める説明を返す。
setErrorString()も参照の こと。
bool QIODevice::getChar(char *c)
デバイスから1文字を読み取り、c に格納する。c がnullptr
の場合、その文字は破棄される。成功した場合はtrue
を返し、そうでない場合はfalse
を返す。
read()、putChar()、およびungetChar()も参照のこと 。
bool QIODevice::isOpen() const
デバイスがオープンされている場合はtrue
を返し、そうでない場合はfalse
を返す。デバイスがオープン状態であるのは、そのデバイスから読み取りまたは書き 込みが可能な場合である。デフォルトでは、openMode() がNotOpen
を返す場合、この関数はfalse
を返す。
openMode() およびQIODeviceBase::OpenModeも参照 。
bool QIODevice::isReadable() const
デバイスからデータを読み取れる場合はtrue
を返し、そうでない場合は false を返す。読み込み可能なバイト数を調べるには、bytesAvailable() を使用する。
これは、デバイスの OpenMode に ReadOnly フラグが含まれているかどうかをチェックする便宜関数です。
openMode() およびOpenModeも参照のこと 。
[virtual]
bool QIODevice::isSequential() const
このデバイスがシーケンシャルであればtrue
を返し、そうでなければ false を返す。
シーケンシャル・デバイスは、ランダム・アクセス・デバイスとは対照的に、開始、 終了、サイズ、現在位置の概念がなく、シークもサポートしていません。データが利用可能であることをデバイスが報告したときにのみ、デバイスから読み出すことができます。シーケンシャル・デバイスの最も一般的な例は、ネットワーク・ソケットである。Unixでは、/dev/zeroやfifoパイプなどの特殊なファイルがシーケンシャルです。
一方、通常のファイルはランダムアクセスに対応している。ファイルにはサイズと現在位置があり、データストリームを前後にシークすることもできる。通常ファイルは非シーケンシャルである。
bytesAvailable()も参照のこと 。
bool QIODevice::isTextModeEnabled() const
Text フラグが有効な場合はtrue
を返し、そうでない場合はfalse
を返す。
setTextModeEnabled()も 参照のこと。
bool QIODevice::isTransactionStarted() const
デバイス上でトランザクションが進行中の場合はtrue
を返し、そうでない場合はfalse
を返す。
startTransaction()も参照 。
bool QIODevice::isWritable() const
データがデバイスに書き込める場合はtrue
を返し、そうでない場合は false を返す。
これは、デバイスの OpenMode に WriteOnly フラグが含まれているかどうかをチェックする便宜関数である。
openMode() およびOpenModeも参照のこと 。
[virtual]
bool QIODevice::open(QIODeviceBase::OpenMode mode)
デバイスをオープンし、その OpenMode をmode に設定する。成功すればtrue
を返し、そうでなければfalse
を返す。この関数は、デバイスをオープンする open() やその他の関数の再実装から呼び出す必要があります。
openMode() およびQIODeviceBase::OpenModeも参照のこと 。
QIODeviceBase::OpenMode QIODevice::openMode() const
デバイスがオープンされたモード(ReadOnly または WriteOnly)を返します。
setOpenMode() およびOpenMode も参照のこと 。
qint64 QIODevice::peek(char *data, qint64 maxSize)
デバイスから最大でmaxSize バイトをdata に、副作用なしで読み込む(つまり、peek() の後にread() を呼び出すと、同じデータが得られる)。読み込んだバイト数を返す。WriteOnly モードでオープンされたデバイスを peek しようとしたときなど、エラーが発生した場合、この関数は -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()も参照のこと 。
QByteArray QIODevice::peek(qint64 maxSize)
これはオーバーロードされた関数である。
デバイスから最大maxSize バイトをピー クし、ピー クしたデータをQByteArray として返す。
例:
bool isExeFile(QFile *file) { return file->peek(2) == "MZ"; }
空のQByteArray を返すということは、現在ピーキング可能なデータがないか、エ ラーが発生したことを意味する。
read()も参照のこと 。
[virtual]
qint64 QIODevice::pos() const
ランダム・アクセス・デバイスの場合、この関数はデータが書き込まれた、または読み出された位置を返す。シーケンシャル・デバイスやクローズド・デバイスの場合、「現在位置」という概念がないため、0が返される。
デバイスの現在の読み取り/書き込み位置は、QIODevice によって内部的に保持されるため、この関数を再実装する必要はない。QIODevice をサブクラス化する場合、デバイス位置の変更をQIODevice に通知するにはQIODevice::seek() を使用する。
isSequential() およびseek()も参照 。
bool QIODevice::putChar(char c)
文字c をデバイスに書き込む。成功するとtrue
を返し、失敗するとfalse
を返す。
write()、getChar()、ungetChar()も 参照のこと。
qint64 QIODevice::read(char *data, qint64 maxSize)
デバイスから最大maxSize バイトをdata に読み取り、読み取ったバイト数を返す。WriteOnly モードでオープンされたデバイスから読み込もうとしたときなど、エ ラーが発生した場合、この関数は -1 を返します。
読み取り可能なデータがなくなった場合は0が返される。しかし、ストリームの終端を過ぎての読み込みはエラーとみなされるため、 この関数はそのような場合 (つまり、クローズしたソケットでの読み込みやプロセスが終了した後の読み込み) には -1 を返す。
readData(),readLine(),write()も参照のこと 。
QByteArray QIODevice::read(qint64 maxSize)
これはオーバーロードされた関数である。
デバイスから最大でmaxSize バイト読み取り、読み取ったデータをQByteArray として返す。
この関数にはエラーを報告する手段がない。空のQByteArray を返すということは、現在読み込めるデータがなかったか、エラーが発生したかのどちらかである。
QByteArray QIODevice::readAll()
デバイスから残りのデータをすべて読み取り、バイト配列として返す。
この関数はエラーを報告する手段を持たない。空のQByteArray を返すことは、現在読み取り可能なデータがなかったか、エラーが発生したかのどちらかを意味する。この関数はまた、より多くのデータが利用可能であったにもかかわらず読み取ることができなかったことを示す方法も持っていません。
int QIODevice::readChannelCount() const
デバイスがオープンされていれば、利用可能な読み取りチャネル数を返し、そうでなければ 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()も参照のこと 。
qint64 QIODevice::readLine(char *data, qint64 maxSize)
この関数は、デバイスから最大maxSize - 1 バイトまでの ASCII 文字行を読み取り、その文字をdata に格納し、読み取ったバイト数を返す。エラーが発生した場合、この関数は読み取れた行の長さを返し、何も読み取れなかった 場合は-1を返します。
終端の'˶0'バイトは常にdata に付加されるので、maxSize は1より大きくなければならない。
以下のどちらかの条件が満たされるまでデータが読み込まれる:
- 最初の'˶n'文字が読み込まれた。
- maxSize - 1バイトが読み込まれる。
- デバイス・データの終わりが検出された。
例えば、次のコードはファイルから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 } }
改行文字 (' \n') がバッファに含まれます。maxSize - 1 バイトが読み込まれる前に改行がない場合、改行はバッファに挿入 されません。ウィンドウズでは改行文字は'˶n'に置き換えられます。
シーケンシャル・デバイスでは、データがすぐに利用できないことがあり、その結果、 部分行が返されることがあることに注意してください。読み込む前にcanReadLine() 関数を呼び出すと、(改行文字を含む) 完全な行が読み込めるかどうかをチェックできます。
この関数は、getChar ()を繰り返し呼び出すことで実装されているreadLineData ()を呼び出す。独自のサブクラスでreadLineData() を再実装すれば、より効率的な実装が可能です。
getChar()、read()、canReadLine()、write()も参照 。
QByteArray QIODevice::readLine(qint64 maxSize = 0)
これはオーバーロードされた関数である。
デバイスから1行(ただしmaxSize 文字以内)を読み込み、その結果をバイト配列として返す。
この関数にはエラーを報告する手段がない。空のQByteArray を返すということは、現在読み込めるデータがなかったか、エラーが発生したかのどちらかである。
[virtual protected]
qint64 QIODevice::readLineData(char *data, qint64 maxSize)
maxSize 文字までをdata に読み込み、読み込んだ文字数を返す。
この関数は、readLine ()によって呼び出され、getChar ()を使用して、その基本実装を提供する。バッファ付きデバイスでは、この関数を再実装することでreadLine() のパフォーマンスを向上させることができます。
readLine()はdata に'˶0'バイトを追加します。readLineData()はこれを行う必要はありません。
この関数を再実装する場合は、正しい値を返すように注意してください。この関数は、改行の終端を含む、この行で読み取られたバイト数、またはこの時点で読み取られる行がない場合は 0 を返す必要があります。エラーが発生した場合は、1バイトも読み取れなかった場合のみ、-1を返すべきである。EOFを過ぎての読み込みはエラーとみなされる。
[signal]
void QIODevice::readyRead()
このシグナルは、デバイスの現在の読み取りチャンネルから新しいデータが読み取れるようになるたびに、1回だけ発せられる。このシグナルは、ネットワーク・データの新しいペイロードがネットワーク・ ソケットに到着したときや、新しいデータ・ブロックがデバイスに追加されたときなど、新しいデー タが利用可能になったときにのみ再発行されます。
readyRead()は再帰的に発信されることはありません。イベントループに入り直したり、readyRead()シグナルに接続されたスロット内でwaitForReadyRead()を呼び出したりしても、シグナルは再発信されません(ただし、waitForReadyRead()がtrueを返すことはあります)。
QIODevice から派生したクラスを実装する開発者への注意 : 新しいデータが到着したときには、常に readyRead() を発行する必要があります (バッファにまだ読み込むデータがあるからといって、readyRead() を発行しないでください)。それ以外の状況では readyRead() を発行してはいけません。
bytesWritten()も参照 。
[virtual]
bool QIODevice::reset()
ランダムアクセスデバイスの入力の開始をシークする。成功した場合はtrueを返し、そうでない場合はfalse
を返す(デバイスがオープンされていない場合など)。
QFile 上でQTextStream を使用する場合、QFile 上で reset() を呼び出すと、QTextStream がファイルをバッファリングするため、期待した結果にならないことに注意。代わりにQTextStream::seek() 関数を使用する。
seek()も参照のこと 。
void QIODevice::rollbackTransaction()
読み取りトランザクションをロールバックします。
入力ストリームをstartTransaction() を呼び出した時点に戻します。この関数は、トランザクションをコミットする前に不完全な読み取りが検出された場合に、 トランザクションをロールバックするためによく使用されます。
startTransaction() およびcommitTransaction()も参照のこと 。
[virtual]
bool QIODevice::seek(qint64 pos)
ランダムアクセスデバイスの場合、この関数は現在位置をpos に設定し、成功した場合はtrueを返し、エ ラーが発生した場合はfalseを返す。シーケンシャル・デバイスの場合、デフォルトの動作は警告を発し、false を返します。
QIODevice をサブクラス化する場合は、QIODevice の組み込みバッファとの整合性を確保するために、関数の先頭で QIODevice::seek() を呼び出す必要があります。
pos() およびisSequential()も参照してください 。
void QIODevice::setCurrentReadChannel(int channel)
QIODevice の現在の読み取りチャネルを、指定されたchannel に設定する。現在の入力チャネルは、関数read()、readAll()、readLine()、およびgetChar() で使用される。また、どのチャネルをトリガとしてQIODevice がreadyRead() を出力するかも決定される。
currentReadChannel()、readChannelCount()、QProcessも参照 。
void QIODevice::setCurrentWriteChannel(int channel)
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 に設定します。デバイスのオープン後にフラグが変更された場合は、この関数を呼び出してオープン・モードを設定する。
void QIODevice::setTextModeEnabled(bool enabled)
enabled が真の場合、この関数はデバイスにText フラグを設定し、そうでない場合はText フラグを削除します。この機能は、QIODevice でカスタム行末処理を提供するクラスにとって便利である。
IO デバイスは、この関数を呼び出す前にオープンしておく必要がある。
isTextModeEnabled()、open()、setOpenMode()も参照のこと 。
[virtual]
qint64 QIODevice::size() const
オープン・ランダム・アクセス・デバイスの場合、この関数はデバイスのサイズを返す。オープン・シーケンシャル・デバイスの場合、bytesAvailable() が返される。
デバイスが閉じている場合、返されるサイズはデバイスの実際のサイズとは異なる。
isSequential() およびpos()も参照のこと 。
qint64 QIODevice::skip(qint64 maxSize)
デバイスから最大maxSize バイトをスキップする。実際にスキップしたバイト数、またはエラーの場合は-1を返す。
この関数は待機せず、すでに読み取り可能なデータのみを破棄する。
デバイスがテキスト・モードでオープンされている場合、行末のターミネータは ' \n' シンボルに変換され、read() およびpeek() の動作と同じように 1 バイトとしてカウントされます。
この関数は、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()も参照してください 。
void QIODevice::startTransaction()
デバイス上で新しい読み取りトランザクションを開始します。
一連の読み取り操作の中で、復元可能なポイントを定義します。シーケンシャル・デバイスの場合、読み込みデータは内部的に複製され、読み込みが不完全な場合の回復を可能にする。ランダム・アクセス・デバイスの場合、この関数は現在位置を保存する。commitTransaction() またはrollbackTransaction() を呼び出して、トランザクションを終了する。
注意: トランザクションの入れ子はサポートされていない。
commitTransaction() およびrollbackTransaction()も参照のこと 。
void QIODevice::ungetChar(char c)
文字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()も参照のこと 。
qint64 QIODevice::write(const char *data, qint64 maxSize)
data から最大maxSize バイトのデータをデバイスに書き込みます。実際に書き込まれたバイト数、またはエラーが発生した場合は -1 を返します。
qint64 QIODevice::write(const QByteArray &data)
これはオーバーロードされた関数である。
data の内容をデバイスに書き込む。実際に書き込まれたバイト数を返し、エラーが発生した場合は -1 を返す。
qint64 QIODevice::write(const char *data)
これはオーバーロードされた関数である。
ゼロ終端の 8 ビット文字列のデータをデバイスに書き込みます。実際に書き込まれたバイト数を返し、エラーが発生した場合は-1を返す。これは以下と等価である。
... QIODevice::write(data, qstrlen(data)); ...
int QIODevice::writeChannelCount() const
デバイスがオープンされている場合、使用可能な書き込みチャネル数を返す。
readChannelCount()も参照の こと。
[pure virtual protected]
qint64 QIODevice::writeData(const char *data, qint64 maxSize)
data から最大maxSize バイトをデバイスに書き込む。書き込まれたバイト数を返し、エラーが発生した場合は -1 を返す。
この関数はQIODevice から呼び出される。QIODevice のサブクラスを作成するときに、この関数を再実装する。
この関数を再実装する場合、この関数が使用可能なデータをすべて書き込んでから戻ることが重要です。これは、QDataStream がクラスに対して操作できるようにするために必要です。QDataStream は、すべての情報が書き込まれたと仮定しているため、問題があっても書き込みを再試行しません。
©2024 The Qt Company Ltd. 本文書に含まれる寄稿文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。