QIODevice Class
QIODeviceクラスはQtの全てのI/Oデバイスの基本インターフェースクラスです。詳細...
ヘッダー | #include <QIODevice> |
CMakeの | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
を継承する: | QObject そしてQIODeviceBase |
によって継承される: | QAbstractSocket QBluetoothSocket, , , , , , , andQBuffer QCoapReply QFileDevice QLocalSocket QNetworkReply QProcess 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() などの I/O 関数は常に即座に戻りますが、デバイス自体との通信は、制御がイベント・ループに戻ったときに発生する可能性があります。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
デバイスがオープンされている場合、利用可能な読み取りチャネルの数を返す。
writeChannelCount() およびQProcessも参照のこと 。
[signal]
void QIODevice::readChannelFinished()
このシグナルは、このデバイスで入力(読み取り)ストリームが閉じられたときに発せられる。このシグナルは、クローズが検出されるとすぐに発せられるので、read() を使用して読み込むためのデータがまだ残っている可能性がある。
[pure virtual protected]
qint64 QIODevice::readData(char *data, qint64 maxSize)
デバイスからdata に最大maxSize バイト読み込み、読み込んだバイト数、またはエラーが発生した場合は -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() 関数を呼び出すと、(改行文字を含む) 完全な行が読み込めるかどうかをチェックできます。
この関数は、readLineData ()を呼び出す。この関数は、getChar ()を繰り返し呼び出すことで実装されている。独自のサブクラスでreadLineData() を再実装すれば、より効率的な実装が可能です。
getChar()、read()、canReadLine()、write()も参照 。
QByteArray QIODevice::readLine(qint64 maxSize = 0)
これはオーバーロードされた関数である。
デバイスから1行(ただしmaxSize 文字以下)を読み込み、その結果をバイト配列として返す。
maxSize が 0 または指定されていない場合、行はどのような長さでもよいので、無制限の読み取りが可能です。
結果の行には行末文字("˶n "または"˶rn")が含まれることがあるので、QByteArray::trimmed()を呼び出す必要があるかもしれない。
この関数にはエラーを報告する手段がない。空のQByteArray を返すということは、現在読み取り可能なデータがないか、エ ラーが発生したかのどちらかである。
[virtual protected]
qint64 QIODevice::readLineData(char *data, qint64 maxSize)
maxSize 文字までをdata に読み込み、読み込んだ文字数を返す。
この関数は、readLine()によって呼び出され、getChar()を使用して、その基本実装を提供する。バッファ付きデバイスは、この関数を再実装することでreadLine()の性能を向上させることができます。
readLine()はdata に'˶0'バイトを追加します。readLineData()はこれを行う必要はありません。
この関数を再実装する場合は、正しい値を返すように注意してください。この関数は、改行の終端を含む、この行で読み取られたバイト数、またはこの時点で読み取られる行がない場合は 0 を返す必要があります。エラーが発生した場合は、読み込まれたバイト数がない場合のみ、-1を返すべきである。EOFを過ぎての読み込みはエラーとみなされる。
[signal]
void QIODevice::readyRead()
このシグナルは、新しいデータがデバイスの現在の読み取りチャネルから読み取れるようになるた びに一度だけ発信されます。このシグナルは、新しいネットワーク・データのペイロードがネットワーク・ ソケットに到着したときや、新しいデータ・ブロックがデバイスに追加されたときなど、新しい データが利用可能になったときにのみ再発行されます。
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 に設定する。デバイスのオープン後にフラグが変更された場合は、この関数を呼び出してオープン・モードを設定する。
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 は、すべての情報が書き込まれたと仮定しているため、問題があっても書き込みを再試行しません。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.