QT 4: программирование GUI на С++ | страница 73
>01 bool Spreadsheet::readFile(const QString &fileName)
>02 {
>03 QFile file(fileName);
>04 if (!file.open(QIODevice::ReadOnly)) {
>05 QMessageBox::warning(this, tr("Spreadsheet"),
>06 tr("Cannot read file %1:\n%2.")
>07 .arg(file.fileName())
>08 .arg(file.errorString()));
>09 return false;
>10 }
>11 QDataStream in(&file);
>12 in.setVersion(QDataStream::Qt_4_1);
>13 quint32 magic;
>14 in >> magic;
>15 if (magic != MagicNumber) {
>16 QMessageBox::warning(this, tr("Spreadsheet"),
>17 tr("The file is not a Spreadsheet file."));
>18 return false;
>19 }
>20 clear();
>21 quint16 row;
>22 quint16 column;
>23 QString str;
>24 QApplication::setOverrideCursor(Qt::WaitCursor);
>25 while (!in.atEnd()) {
>26 in >> row >> column >> str;
>27 setFormula(row, column, str);
>28 }
>29 QApplication::restoreOverrideCursor();
>30 return true;
>31 }
Функция readFile() очень напоминает writeFile(). Для чтения файла мы пользуемся объектом QFile, но теперь мы используем флажок QIODevice::ReadOnly, а не QIODevice::WriteOnly. Затем мы устанавливаем версию QDataStream на значение 7. Формат чтения всегда должен совпадать с форматом записи.
Если в начале файла содержится правильное «волшебное» число, мы вызываем функцию clear() для очистки в электронной таблице всех ячеек и затем считываем данные ячеек. Поскольку файл содержит только данные для непустых ячеек, маловероятно, что будет заполнена каждая ячейка электронной таблицы, поэтому мы должны очистить все ячейки перед чтением файла.
Реализация меню Edit
Теперь мы готовы приступить к реализации слотов, относящихся к меню Edit данного приложения.
Рис. 4.4. Меню Edit приложения Электронная таблица.
>01 void Spreadsheet::cut()
>02 {
>03 copy();
>04 del();
>05 }
Слот cut() соответствует пункту меню Edit | Cut (Правка | Вырезать). Он реализуется просто, поскольку операция Cut выполняется с помощью операции Сору, за которой следует операция Delete.
>01 void Spreadsheet::copy()