Класс QIODevice
Класс QIODevice — это базовый интерфейсный класс всех устройств ввода/вывода в Qt. Подробнее...
| Заголовок: | #include <QIODevice> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследует: | QObject и QIODeviceBase |
| Наследуется от: | QAbstractSocket, QBuffer, QCoapReply, QFileDevice, QLocalSocket, QNetworkReply и QProcess |
Примечание: Все функции в этом классе являются реентерабельными.
Общедоступные функции
| QIODevice(QObject *parent) | |
| QIODevice() | |
| 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 char *data) |
| qint64 | write(const QByteArray &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) |
| virtual qint64 | skipData(qint64 maxSize) |
| virtual qint64 | writeData(const char *data, qint64 maxSize) = 0 |
Подробное описание
QIODevice предоставляет как общее реализацию, так и абстрактный интерфейс для устройств, поддерживающих чтение и запись блоков данных, таких как QFile, QBuffer и QTcpSocket. QIODevice является абстрактным и не может быть экземпляризован, но часто используется интерфейс, который он определяет, для предоставления независимых от устройства функций ввода-вывода. Например, классы XML Qt работают с указателем QIODevice, позволяя их использовать с различными устройствами (такими как файлы и буферы).
Перед доступом к устройству необходимо вызвать open() для установки правильного режима открытия (например, ReadOnly или ReadWrite). Затем можно записать данные в устройство с помощью write() или putChar(), и читать, вызывая read(), readLine() или readAll(). После завершения работы с устройством вызовите close().
QIODevice различает два типа устройств: устройства с произвольным доступом и последовательные устройства.
- Устройства с произвольным доступом поддерживают перемещение к произвольным позициям с помощью seek(). Текущая позиция в файле доступна с помощью вызова pos(). QFile и QBuffer являются примерами устройств с произвольным доступом.
- Последовательные устройства не поддерживают перемещение к произвольным позициям. Данные должны быть прочитаны за один проход. Функции pos() и size() не работают для последовательных устройств. QTcpSocket и QProcess являются примерами последовательных устройств.
Вы можете использовать isSequential() для определения типа устройства.
QIODevice излучает readyRead(), когда новые данные доступны для чтения; например, если новые данные прибыли по сети или если дополнительные данные добавлены к файлу, из которого вы читаете. Вы можете вызвать bytesAvailable() для определения количества байтов, которые в данный момент доступны для чтения. Часто bytesAvailable() используется совместно с сигналом readyRead() при программировании с асинхронными устройствами, такими как QTcpSocket, где фрагменты данных могут прибывать в произвольные моменты времени. QIODevice излучает сигнал bytesWritten() каждый раз, когда блок данных был записан в устройство. Используйте bytesToWrite() для определения текущего объёма данных, ожидающих записи.
Некоторые подклассы QIODevice, такие как QTcpSocket и QProcess, являются асинхронными. Это означает, что функции ввода-вывода, такие как write() или read(), всегда возвращаются немедленно, в то время как общение с самим устройством может произойти, когда управление возвращается в цикл событий. QIODevice предоставляет функции, которые позволяют заставить эти операции выполняться немедленно, блокируя вызывающую нить и не входя в цикл событий. Это позволяет подклассам QIODevice использоваться без цикла событий или в отдельной нити:
- waitForReadyRead() - Эта функция приостанавливает работу в вызывающей нити до тех пор, пока новые данные не станут доступными для чтения.
- waitForBytesWritten() - Эта функция приостанавливает работу в вызывающей нити до тех пор, пока один блок данных не будет записан в устройство.
- 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, вы можете предоставить тот же интерфейс для собственных устройств ввода-вывода. Подклассы QIODevice должны реализовать только защищённые функции readData() и writeData(). QIODevice использует эти функции для реализации всех удобных функций, таких как getChar(), readLine() и write(). QIODevice также обрабатывает контроль доступа, поэтому вы можете с уверенностью предполагать, что устройство открыто в режиме записи, если вызывается writeData().
Некоторые подклассы, такие как QFile и QTcpSocket, реализуются с использованием буфера памяти для промежуточного хранения данных. Это уменьшает количество вызовов доступа к устройству, которые часто очень медленные. Буферизация ускоряет функции, такие как getChar() и putChar(), так как они могут работать с буфером памяти вместо непосредственного взаимодействия с устройством. Однако некоторые операции ввода-вывода плохо работают с буфером. Например, если несколько пользователей откроют одно и то же устройство и будут читать его посимвольно, они могут прочитать одни и те же данные, когда намеревались прочитать отдельные блоки каждый. По этой причине QIODevice позволяет вам обойти буферизацию, передавая флаг Unbuffered в open(). При создании подклассов QIODevice помните об обходе любого используемого вами буфера, когда устройство открыто в режиме Unbuffered.
Обычно поток входящих данных от асинхронного устройства фрагментирован, и блоки данных могут прибывать в произвольные моменты времени. Для обработки неполных чтений структур данных используйте механизм транзакций, реализованный в QIODevice. См. startTransaction() и связанные функции для получения более подробной информации.
Некоторые последовательные устройства поддерживают общение через несколько каналов. Эти каналы представляют отдельные потоки данных, которые имеют свойство независимой последовательной доставки. После открытия устройства вы можете определить количество каналов, вызвав функции readChannelCount() и writeChannelCount(). Для переключения между каналами вызовите setCurrentReadChannel() и setCurrentWriteChannel() соответственно. QIODevice также предоставляет дополнительные сигналы для обработки асинхронного общения в режиме per-channel.
См. также QBuffer, QFile и QTcpSocket.
Документация по функциям-членам
QIODevice::QIODevice(QObject *parent)
Конструирует объект QIODevice с заданным parent.
QIODevice::QIODevice()
Конструирует объект QIODevice.
[signal] void QIODevice::aboutToClose()
Этот сигнал излучается при закрытии устройства. Подключайте этот сигнал, если у вас есть операции, которые необходимо выполнить перед закрытием устройства (например, если у вас есть данные в отдельном буфере, которые нужно записать в устройство).
[signal] void QIODevice::bytesWritten(qint64 bytes)
Этот сигнал излучается каждый раз, когда блок данных был записан в текущий канал записи устройства. Аргумент bytes устанавливается в количество записанных байтов в этом блоке.
bytesWritten() не излучается рекурсивно; если вы повторно входите в цикл событий или вызываете waitForBytesWritten() внутри слота, подключенного к сигналу bytesWritten(), сигнал не будет повторно излучен (хотя waitForBytesWritten() может всё ещё вернуть true).
См. также readyRead().
[signal, since 5.7] void QIODevice::channelBytesWritten(int channel, qint64 bytes)
Этот сигнал излучается каждый раз, когда блок данных был записан в устройство. Аргумент bytes устанавливается в количество записанных байтов в этом блоке, а channel — в канал, в который они были записаны. В отличие от bytesWritten(), он излучается независимо от текущего канала записи.
channelBytesWritten() может излучаться рекурсивно — даже для того же канала.
Функция была введена в Qt 5.7.
См. также bytesWritten() и channelReadyRead().
[signal, since 5.7] void QIODevice::channelReadyRead(int channel)
Этот сигнал излучается, когда новые данные доступны для чтения из устройства. Аргумент channel устанавливается в индекс канала чтения, на котором прибыли данные. В отличие от readyRead(), он излучается независимо от текущего канала чтения.
channelReadyRead() может излучаться рекурсивно — даже для того же канала.
Функция была введена в Qt 5.7.
См. также readyRead() и channelBytesWritten().
[signal] void QIODevice::readChannelFinished()
Этот сигнал испускается, когда входной (чтения) поток закрывается в этом устройстве. Он испускается как только закрытие обнаружено, что означает, что данные для чтения с помощью read() могут все еще быть доступны.
[signal] void QIODevice::readyRead()
Этот сигнал испускается каждый раз, когда новые данные становятся доступными для чтения из текущего канала чтения устройства. Он будет испущен только после того, как новые данные станут доступны, например, когда новый пакет сетевых данных прибыл на ваш сетевой сокет или когда новый блок данных был добавлен к вашему устройству.
readyRead() не испускается рекурсивно; если вы повторно входите в цикл событий или вызываете waitForReadyRead() внутри слота, подключенного к сигналу readyRead(), сигнал не будет повторно испущен (хотя waitForReadyRead() может все еще возвращать true).
Примечание для разработчиков, реализующих классы, производные от QIODevice: вы всегда должны испускать readyRead(), когда новые данные прибыли (не испускайте его только потому, что данные все еще есть в ваших буферах). Не испускайте readyRead() в других условиях.
См. также bytesWritten().
[virtual] QIODevice::~QIODevice()
Деструктор является виртуальным, и QIODevice — это абстрактный базовый класс. Этот деструктор не вызывает close(), но деструктор подкласса может. Если вы сомневаетесь, вызовите close() перед уничтожением QIODevice.
[virtual] bool QIODevice::atEnd() const
Возвращает true если текущая позиция чтения и записи находится в конце устройства (т. е. больше нет данных, доступных для чтения на устройстве); в противном случае возвращает false.
Для некоторых устройств atEnd() может возвращать true, даже если есть больше данных для чтения. Этот специальный случай применим только к устройствам, которые генерируют данные в прямой ответ на вызов read() (например, /dev или /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().
[virtual] bool QIODevice::canReadLine() const
Возвращает true если полная строка данных может быть прочитана из устройства; в противном случае возвращает false.
Обратите внимание, что устройства без буфера, которые не имеют способа определить, что может быть прочитано, всегда возвращают false.
Эта функция часто вызывается в сочетании с сигналом readyRead().
Подклассы, которые переопределяют эту функцию, должны вызвать базовую реализацию, чтобы включить содержимое буфера QIODevice. Пример:
bool CustomDevice::canReadLine() const
{
return buffer.contains('\n') || QIODevice::canReadLine();
} См. также readyRead() и readLine().
[virtual] void QIODevice::close()
Сначала испускает aboutToClose(), затем закрывает устройство и устанавливает его OpenMode в NotOpen. Строка ошибки также сбрасывается.
См. также setOpenMode() и QIODeviceBase::OpenMode.
[since 5.7] void QIODevice::commitTransaction()
Завершает операцию чтения.
Для последовательных устройств все данные, записанные во внутренний буфер во время транзакции, будут удалены.
Эта функция была добавлена в Qt 5.7.
См. также startTransaction() и rollbackTransaction().
[since 5.7] int QIODevice::currentReadChannel() const
Возвращает индекс текущего канала чтения.
Эта функция была добавлена в Qt 5.7.
См. также setCurrentReadChannel(), readChannelCount() и QProcess.
[since 5.7] int QIODevice::currentWriteChannel() const
Возвращает индекс текущего канала записи.
Эта функция была добавлена в Qt 5.7.
См. также setCurrentWriteChannel() и writeChannelCount().
QString QIODevice::errorString() const
Возвращает удобочитаемое описание последней ошибки устройства, которая произошла.
См. также setErrorString().
bool QIODevice::getChar(char *c)
Читает один символ из устройства и сохраняет его в c. Если c является nullptr, символ отбрасывается. Возвращает true при успехе; в противном случае возвращает false.
См. также read(), putChar() и ungetChar().
bool QIODevice::isOpen() const
Возвращает true если устройство открыто; в противном случае возвращает false. Устройство открыто, если оно может быть прочитано и/или записано. По умолчанию эта функция возвращает false если openMode() возвращает NotOpen.
См. также 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
Возвращает true если флаг Text включен; в противном случае возвращает false.
См. также setTextModeEnabled().
[since 5.7] bool QIODevice::isTransactionStarted() const
Возвращает true если транзакция выполняется на устройстве, в противном случае false.
Эта функция была добавлена в Qt 5.7.
См. также 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 без побочных эффектов (т. е., если вы вызовете read() после peek(), вы получите те же данные). Возвращает количество считанных байтов. Если произошла ошибка, например, при попытке 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().
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::seek(), чтобы уведомить QIODevice об изменениях в позиции устройства.
См. также 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 может означать, что данные для чтения в данный момент недоступны или произошла ошибка.
[since 5.7] int QIODevice::readChannelCount() const
Возвращает количество доступных каналов чтения, если устройство открыто; в противном случае возвращает 0.
Эта функция была добавлена в Qt 5.7.
См. также writeChannelCount() и QProcess.
[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)
Эта функция считывает строку ASCII-символов из устройства, не более maxSize - 1 байт, сохраняет символы в data и возвращает количество считанных байтов. Если строка не могла быть прочитана, но ошибка не произошла, эта функция возвращает 0. Если произошла ошибка, эта функция возвращает длину того, что могло быть прочитано, или -1, если ничего не было прочитано.
В data всегда добавляется завершающий символ '\0', поэтому maxSize должно быть больше 1.
Данные считываются до выполнения одного из следующих условий:
- Считан первый символ '\n'.
- Считано 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
}
} Символ новой строки ('\n') включается в буфер. Если символ новой строки не встречается до чтения maxSize - 1 байтов, символ новой строки не будет вставлен в буфер. В Windows символы новой строки заменяются на '\n'.
Эта функция вызывает readLineData(), которая реализована с помощью многократных вызовов getChar(). Вы можете обеспечить более эффективную реализацию, переопределив readLineData() в собственном подклассе.
См. также getChar(), read() и write().
QByteArray QIODevice::readLine(qint64 maxSize = 0)
Это перегруженная функция.
Считывает строку из устройства, но не более maxSize символов, и возвращает результат как массив байтов.
Эта функция не имеет возможности сообщать об ошибках; возвращение пустого QByteArray может означать, что данные для чтения в данный момент недоступны или произошла ошибка.
[virtual protected] qint64 QIODevice::readLineData(char *data, qint64 maxSize)
Считывает до maxSize символов в data и возвращает количество прочитанных символов.
Эта функция вызывается readLine() и предоставляет базовую реализацию, используя getChar(). Буферизованные устройства могут улучшить производительность readLine() путём переопределения этой функции.
readLine() добавляет символ '\0' в data; readLineData() этого делать не нужно.
Если вы переопределяете эту функцию, будьте внимательны к возвращаемому значению: оно должно возвращать количество прочитанных байтов в этой строке, включая завершающий символ новой строки, или 0, если строка для чтения в данный момент отсутствует. Если произошла ошибка, оно должно возвращать -1 только в том случае, если байты не были прочитаны. Чтение за пределами EOF считается ошибкой.
[virtual] bool QIODevice::reset()
Переходит к началу ввода для устройств с произвольным доступом. Возвращает true при успехе; в противном случае возвращает false (например, если устройство не открыто).
Обратите внимание, что при использовании QTextStream с QFile вызов reset() для QFile не даст ожидаемого результата, так как QTextStream буферизует файл. Используйте функцию QTextStream::seek() вместо этого.
См. также seek().
[since 5.7] void QIODevice::rollbackTransaction()
Отменяет транзакцию чтения.
Восстанавливает входной поток до момента вызова startTransaction(). Эта функция обычно используется для отмены транзакции, когда была обнаружена неполное чтение до подтверждения транзакции.
Эта функция была добавлена в Qt 5.7.
См. также startTransaction() и commitTransaction().
[virtual] bool QIODevice::seek(qint64 pos)
Для устройств с произвольным доступом эта функция устанавливает текущую позицию в pos, возвращая true при успехе или false в случае ошибки. Для последовательных устройств стандартное поведение — вывести предупреждение и вернуть false.
При наследовании от QIODevice необходимо вызвать QIODevice::seek() в начале вашей функции, чтобы обеспечить целостность с встроенным буфером QIODevice.
См. также pos() и isSequential().
[since 5.7] void QIODevice::setCurrentReadChannel(int channel)
Устанавливает текущий канал чтения устройства QIODevice на заданный channel. Текущий входной канал используется функциями read(), readAll(), readLine() и getChar(). Он также определяет, какой канал вызывает у QIODevice излучение сигнала readyRead().
Эта функция была введена в Qt 5.7.
См. также currentReadChannel(), readChannelCount() и QProcess.
[since 5.7] void QIODevice::setCurrentWriteChannel(int channel)
Устанавливает текущий канал записи устройства QIODevice на заданный channel. Текущий выходной канал используется функциями write() и putChar(). Он также определяет, какой канал вызывает у QIODevice излучение сигнала bytesWritten().
Эта функция была введена в Qt 5.7.
См. также currentWriteChannel() и writeChannelCount().
[protected] void QIODevice::setErrorString(const QString &str)
Устанавливает удобочитаемое описание последней ошибки устройства, которая произошла, на str.
См. также errorString().
[protected] void QIODevice::setOpenMode(QIODeviceBase::OpenMode openMode)
Устанавливает режим открытия устройства на openMode. Вызовите эту функцию, чтобы установить режим открытия, если флаги изменились после открытия устройства.
См. также openMode() и OpenMode.
void QIODevice::setTextModeEnabled(bool enabled)
Если enabled равно true, эта функция устанавливает флаг Text для устройства; в противном случае флаг Text удаляется. Эта функция полезна для классов, которые предоставляют пользовательскую обработку конца строки в QIODevice.
Устройство ввода-вывода должно быть открыто перед вызовом этой функции.
См. также isTextModeEnabled(), open() и setOpenMode().
[virtual] qint64 QIODevice::size() const
Для открытых устройств с произвольным доступом эта функция возвращает размер устройства. Для открытых последовательных устройств возвращается bytesAvailable().
Если устройство закрыто, возвращаемый размер не отражает фактический размер устройства.
См. также isSequential() и pos().
[since 5.10] qint64 QIODevice::skip(qint64 maxSize)
Пропускает до maxSize байтов из устройства. Возвращает количество фактически пропущенных байтов или -1 в случае ошибки.
Эта функция не ожидает и только отбрасывает данные, которые уже доступны для чтения.
Если устройство открыто в текстовом режиме, разделители конца строки переводятся в символы '\n' и учитываются как один байт так же, как и поведение read() и peek().
Эта функция работает со всеми устройствами, включая последовательные, которые не могут seek(). Она оптимизирована для пропуска нежелательных данных после вызова peek().
Для устройств с произвольным доступом skip() можно использовать для перехода вперед от текущей позиции. Отрицательные значения maxSize недопустимы.
Эта функция была введена в Qt 5.10.
См. также 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().
[since 5.7] void QIODevice::startTransaction()
Начинает новую транзакцию чтения на устройстве.
Определяет точку восстановления в последовательности операций чтения. Для последовательных устройств данные чтения дублируются во внутренней памяти для восстановления в случае неполного чтения. Для устройств с произвольным доступом эта функция сохраняет текущую позицию. Вызовите commitTransaction() или rollbackTransaction() для завершения транзакции.
Примечание: Вложенные транзакции не поддерживаются.
Эта функция была введена в Qt 5.7.
См. также commitTransaction() и rollbackTransaction().
void QIODevice::ungetChar(char c)
Возвращает символ c обратно в устройство и уменьшает текущую позицию, если позиция не равна 0. Эта функция обычно используется для отмены операции getChar(), например, при написании парсера с возвратом.
Если c ранее не читалось из устройства, поведение не определено.
Примечание: Эта функция недоступна во время выполнения транзакции.
[virtual] bool QIODevice::waitForBytesWritten(int msecs)
Для буферизованных устройств эта функция ожидает, пока пакет буферизованных данных записи не будет записан на устройство и не будет выпущен сигнал bytesWritten(), или пока не пройдет msecs миллисекунд. Если msecs равно -1, эта функция не будет ожидать. Для устройств без буферизации она возвращает результат немедленно.
Возвращает true если пакет данных был записан на устройство; в противном случае возвращает false (т.е. если операция истекла или произошла ошибка).
Эта функция может работать без цикла событий. Она полезна при написании приложений без графического интерфейса и при выполнении операций ввода-вывода в потоке, не связанном с графическим интерфейсом.
Если она вызвана из слота, подключенного к сигналу bytesWritten(), bytesWritten() не будет повторно излучен.
Переопределите эту функцию для обеспечения блокирующего API для пользовательского устройства. Стандартная реализация ничего не делает и возвращает false.
Предупреждение: Вызов этой функции из основного (графического) потока может привести к зависанию графического интерфейса пользователя.
См. также waitForReadyRead().
[virtual] bool QIODevice::waitForReadyRead(int msecs)
Блокирует, пока новые данные не станут доступными для чтения и не будет излучен сигнал readyRead(), или пока не пройдет msecs миллисекунд. Если msecs равно -1, эта функция не будет ожидать.
Возвращает true если новые данные доступны для чтения; в противном случае возвращает false (если операция истекла или произошла ошибка).
Эта функция может работать без цикла событий. Она полезна при написании приложений без графического интерфейса и при выполнении операций ввода-вывода в потоке, не связанном с графическим интерфейсом.
Если она вызвана из слота, подключенного к сигналу readyRead(), readyRead() не будет повторно излучен.
Переопределите эту функцию для обеспечения блокирующего API для пользовательского устройства. Стандартная реализация ничего не делает и возвращает false.
Предупреждение: Вызов этой функции из основного (графического) потока может привести к зависанию графического интерфейса пользователя.
См. также waitForBytesWritten().
qint64 QIODevice::write(const char *data, qint64 maxSize)
Записывает не более maxSize байтов данных из data на устройство. Возвращает количество байтов, которые были фактически записаны, или -1 в случае ошибки.
См. также read() и writeData().
qint64 QIODevice::write(const char *data)
Это перегруженная функция.
Записывает данные из нуль-терминированной строки символов 8-битного типа на устройство. Возвращает количество байтов, которые были фактически записаны, или -1 в случае ошибки. Это эквивалентно
... QIODevice::write(data, qstrlen(data)); ...
См. также read() и writeData().
qint64 QIODevice::write(const QByteArray &data)
Это перегруженный метод.
Записывает содержимое data в устройство. Возвращает количество байтов, которые были фактически записаны, или -1, если произошла ошибка.
См. также read() и writeData().
[since 5.7] int QIODevice::writeChannelCount() const
Возвращает количество доступных каналов записи, если устройство открыто; в противном случае возвращает 0.
Этот метод был введён в Qt 5.7.
См. также readChannelCount().
[pure virtual protected] qint64 QIODevice::writeData(const char *data, qint64 maxSize)
Записывает до maxSize байтов из data в устройство. Возвращает количество записанных байтов или -1, если произошла ошибка.
Этот метод вызывается методом QIODevice. Переопределите этот метод при создании подкласса QIODevice.
При переопределении этого метода важно, чтобы этот метод записывал все доступные данные перед возвратом. Это необходимо для работы класса QDataStream с классом. QDataStream предполагает, что вся информация была записана, и поэтому не пытается повторно записать, если возникла проблема.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qiodevice.html