На этом шаге рассмотрим класс QIODevice.
Класс QIODevice — это абстрактный класс, обобщающий устройство ввода-вывода, который содержит виртуальные методы для открытия и закрытия устройства ввода-вывода, а также для чтения и записи блоков данных или отдельных символов.
Реализация конкретного устройства происходит в унаследованных классах. В Qt есть четыре класса, наследующих класс QIODevice (рис. 1):
Рис.1. Иерархия классов ввода-вывода
Для работы с устройством его необходимо открыть в одном из режимов, определенных в заголовочном файле класса QIODevice:
Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод 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. Вывод содержимого файла
Файлы приложения можно взять здесь.
Класс QIODevice предоставляет ряд методов, с помощью которых можно получить информацию об устройстве ввода-вывода. Например, одни устройства могут только записывать информацию, другие — только считывать, а третьи способны делать и то, и другое. Чтобы проверить, какие операции доступны при работе с устройством, следует воспользоваться методами isReadable() и isWriteable().
На следующем шаге рассмотрим методы работы с файлами. Описание этих методов содержится в классе QFile.