На этом шаге рассмотрим класс QIODevice.
Класс QIODevice — это абстрактный класс, обобщающий устройство ввода-вывода, который содержит виртуальные методы для открытия и закрытия устройства ввода-вывода, а также для чтения и записи блоков данных или отдельных символов.
Реализация конкретного устройства происходит в унаследованных классах. В Qt есть четыре класса, наследующих класс QIODevice (рис. 1):
Рис.1. Иерархия классов ввода-вывода
- QFile — класс для проведения операций с файлами;
- QBuffer — класс буфера, который позволяет записывать и считывать данные в массив QByteArray, как будто бы это устройство или файл;
- QAbstractSocket — базовый класс для сетевой коммуникации посредством сокетов;
- QProcess — класс, предоставляющий возможность запуска процессов с дополнительными аргументами и позволяющий обмениваться информацией с этими процессами посредством методов, определенных в QIODevice.
Для работы с устройством его необходимо открыть в одном из режимов, определенных в заголовочном файле класса QIODevice:
- QIODevice::NotOpen — устройство не открыто (это значение не имеет смысла передавать в метод open());
- QIODevice::ReadOnly — открытие устройства только для чтения данных;
- QIODevice::WriteOnly — открытие устройства только для записи данных;
- QIODevice::ReadWrite — открытие устройства для чтения и записи данных (то же, что ReadOnly | WriteOnly);
- QIODevice::Append — открытие устройства для добавления данных;
- QIODevice::Unbuffered — открытие для непосредственного доступа к данным, в обход промежуточных буферов чтения и записи;
- QIODevice::Text — применяется для преобразования символов переноса строки в зависимости от платформы. В ОС Windows используется комбинация "r\n", а в MacOS X и Unix — "\r";
- QIODevice::Truncate — все данные устройства, по возможности, должны быть удалены при открытии.
Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод openMode().
Считывать и записывать данные можно с помощью методов read() и write(). Для чтения всех данных сразу определен метод readAll(), который возвращает их в объекте типа QByteArray. Строку или символ можно прочитать методами readLine() и getChar() соответственно.
В классе QIODevice определен метод для смены текущего положения seek(). Получить текущее положение можно вызовом метода pos(). Но не забывайте, что эти методы применимы только для прямого доступа к данным. При последовательном доступе, каким является сетевое соединение, они теряют смысл. Более того, в этом случае теряет смысл и метод size(), возвращающий размер данных устройства. Все эти операции применимы только для классов QFile, QBuffer и QTemporaryFile.
Для создания собственного класса устройства ввода-вывода, для которого Qt не предоставляет поддержки, необходимо унаследовать класс QIODevice и реализовать в нем методы readData() и writeData(). В большинстве случаев может потребоваться переопределить методы open(), close() и atEnd().
Благодаря интерфейсу класса QIODevice можно работать со всеми устройствами одинаково, и при работе обычно не имеет значения, является ли устройство файлом, буфером или другим устройством. Например, с помощью такого метода можно выводить на консоль данные из любого устройства:
void print(QIODevice* pdev) { char ch; QString str; pdev->open(QIODevice::ReadOnly); for (; !pdev->atEnd();) { pdev->getChar(&ch); str += ch; } pdev->close(); qDebug() << str; }
На рис. 2 приведен пример использования данной функции для вывода содержимого файла.
Рис.2. Вывод содержимого файла
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг