[Предыдущий: Адресная книга. Урок 5 - Добавляем функцию поиска] [Содержание] [Следующий: Урок 7]
Адресная книга. Урок 6 - Загрузка и сохранение
Файлы:
На этом уроке освещаются возможности Qt по управлению файлами, которые мы используем для написания подпрограмм загрузки и сохранения приложения адресной книги.
Несмотря на то, что просмотр и поиск контактов являются полезными функциями, наша адресная книга не готова полностью для использования до тех, пока мы не сможем сохранять существующие контакты и загружать их снова позже. Qt предоставляет несколько классов для ввода и вывода, но мы предпочли использовать два из них, простых для использования в сочетании: QFile и QDataStream.
Объект QFile отображает на диск файл, который можно читать и в который можно записывать. QFile - подкласс более общего класса QIODevice, который отображает многие виды устройств.
Объект QDataStream используется для преобразования в последовательную форму двоичных данных, поэтому они могут быть сохранены в QIODevice и извлечены позднее. Чтение из QIODevice и запись в него так же просто как и открытие потока - с соответствующим устройством в качестве параметра - и чтение из него либо запись в него.
Определение класса AddressBook
Мы объявили два открытых слота, saveToFile() и loadFromFile(), а также два объекта QPushButton, loadButton и saveButton.
void saveToFile();
void loadFromFile();
...
QPushButton *loadButton;
QPushButton *saveButton;
Реализация класса AddressBook
В нашем конструкторе мы создаем экземпляры объектов класса loadButton и saveButton. В идеале, было бы более дружественно к пользователю установить метки кнопок в значения "Load contacts from a file" и "Save contacts to a file". Однако, из-за размеров остальных кнопок мы установили метки в значения Load... и Save.... К счастью, Qt предоставляет простой способ установить всплывающие подсказки с помощью setToolTip() и мы используем это следующим образом для наших кнопок:
loadButton->setToolTip(tr("Load contacts from a file"));
...
saveButton->setToolTip(tr("Save contacts to a file"));
Хотя это и не показано здесь, точно также как и для других реализованных нами функций мы добавили кнопки в компоновку правой панели, button1Layout, и соединили сигналы кнопок clicked() с соответствующими им слотами.
Для функции сохранения мы сначала получаем fileName используя QFileDialog::getSaveFileName(). Эта вспомогательная функция предоставляется классом QFileDialog, который выводит на экране модальный диалог выбора файла и позволяет пользователю ввести имя файла или выбрать существующий файл .abk. Файл с расширением .abk - файл нашей Адресной книги, который мы создали когда сохраняли контакты.
void AddressBook::saveToFile()
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save Address Book"), "",
tr("Address Book (*.abk);;All Files (*)"));
Выводимый на экран диалог выбор файла показан ниже:
Если fileName не пустая, мы создаем объект QFile - file - с именем fileName. QFile работает с QDataStream как QFile с QIODevice.
Далее мы пытаемся открыть файл в режиме WriteOnly. Если неудачно, то чтобы проинформировать пользователя выводим на экран QMessageBox.
if (fileName.isEmpty())
return;
else {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
В противном случае, мы создаем экземпляр объекта QDataStream, out, для записи открытого файла. QDataStream требует, чтобы для чтения и записи использовалась одинаковая версия потока. Мы обезопасим себя на такой случай установив используемую версию в значение версии, представленной в Qt 4.5 перед преобразованием данных в последовательный вид в file.
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_5);
out << contacts;
}
}
Для функции загрузки мы также получаем fileName используя QFileDialog::getOpenFileName(). Эта функция, аналог функции QFileDialog::getSaveFileName(), также выводит на экран модальный диалог выбора файлов и позволяет пользователю ввести имя файла или выбрать существующий файл .abk для загрузки в адресную книгу.
void AddressBook::loadFromFile()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Address Book"), "",
tr("Address Book (*.abk);;All Files (*)"));
В Windows, например, эта функция выводит на экран обычный диалог выбора файлов, как показано на следующем снимке экрана.
Если fileName не пустая, мы снова используем объект QFile, file, и пытаемся открыть его в режиме ReadOnly. Аналогично нашей реализации функции saveToFile() если эта попытка неудачна, то мы выводим на экран QMessageBox чтобы проинформировать пользователя.
if (fileName.isEmpty())
return;
else {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_5);
contacts.empty();
in >> contacts;
В противном случае, мы создаем экземпляр объекта QDataStream, in, устанавливаем его версию как это сделано выше и читаем данные в последовательном виде в структуру данных contacts. Обратите внимание на то, что мы очищаем contacts перед началом чтения данных в целях упрощения процесса чтения файла. Более усовершенствованный метод читает контакты во временный объект QMap и копирует только те контакты, которых не было в contacts.
if (contacts.isEmpty()) {
QMessageBox::information(this, tr("No contacts in file"),
tr("The file you are attempting to open contains no contacts."));
} else {
QMap<QString, QString>::iterator i = contacts.begin();
nameLine->setText(i.key());
addressText->setText(i.value());
}
}
updateInterface(NavigationMode);
}
Чтобы вывести на экран контакты, которые были прочитаны из файла, мы должны сначала проверить правильность полученных данных, чтобы убедиться в том, что прочитанный файл на самом деле содержит контакты адресной книги. Если это так, то мы выводим на экран первый контакт; в противном случае, мы выводим на экране QMessageBox чтобы проинформировать пользователя о проблеме. В заключение, мы обновляем интерфейс чтобы включить и выключить соответствующие кнопки.
[Предыдущий: Адресная книга. Урок 5 - Добавляем функцию поиска] [Содержание] [Следующий: Урок 7]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|