Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Файл данных Электронная таблица имеет очень простой формат. Он начинается с 32-битового числа, идентифицирующего формат файла («волшебное» число MagicNumber определено в spreadsheet.h как 0x7F51C883 — произвольное случайное число). Затем идет последовательность блоков, каждый из которых содержит строку, столбец и формулу одной ячейки. Для экономии места мы не заполняем пустые ячейки.

Рис. 4.3. Формат файла данных для приложения Электронная таблица.

Точное представление типов данных определяется в QDataStream. Например, quint16 представляется двумя байтами со старшим байтом в конце, a QString задается длиной строки, за которой следуют символы в коде Unicode.

Двоичное представление типов в Qt достаточно сильно усовершенствовалось со времени выхода версии Qt 1.0. Такая тенденция, вероятно, сохранится в будущих версиях Qt, чтобы идти вровень с развитием существующих типов и обеспечить новые типы в Qt. По умолчанию класс QDataStream использует самую последнюю версию двоичного формата (версия 7 в Qt 4.1), но он также может быть настроен на чтение прошлых версий. Для того чтобы избежать проблем совместимости при перекомпиляции приложения в будущем, в новой версии Qt мы заставляем QDataStream использовать версию 7 вне зависимости от версии Qt, в которой оно компилируется. (Для удобства используется константа QDataStream::Qt_4_1, равная 7.)

Класс QDataStream достаточно универсален. Он может использоваться для объекта QFile, но также и для QBuffer, QProcess, QTcpSocket или QUdpSocket. Qt также предоставляет класс QTextStream, который может использоваться с QDataStream для чтения и записи текстовых файлов. В главе 10 подробно рассматриваются эти классы и описываются различные методы работы с разными версиями QDataStream.

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

02 {

03 QTableWidgetSelectionRange range = selectedRange;

04 QString str;

05 for (int i = 0; i < range.rowCount; ++i) {

06 if (i > 0)

07 str += "\n";

08 for (int j = 0; j < range.columnCount; ++j) {

09 if (j > 0)

10 str += "\t";

11 str += formula(range.topRow + i, range.leftColumn + j);

12 }

13 }

14 QApplication::clipboard->setText(str);

15 }

Слот copy соответствует пункту меню Edit | Copy (Правка | Копировать). Он в цикле обрабатывает всю выделенную область ячеек (если нет явно выделенной области, то ею будет просто текущая ячейка). Формула каждой выделенной ячейки добавляется в QString, причем строки отделяются символом новой строки, а столбцы разделяются символом табуляции.

Поделиться:
Популярные книги

Прапорщик. Назад в СССР. Книга 7

Гаусс Максим
7. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 7

Газлайтер. Том 2

Володин Григорий Григорьевич
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Женить босса срочно!

Верди Алиса
Служебные романы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Женить босса срочно!

Стёртые буквы

Первушина Елена Владимировна
Фантастика:
фэнтези
6.25
рейтинг книги
Стёртые буквы

Барон

Первухин Андрей Евгеньевич
5. Ученик
Фантастика:
фэнтези
5.60
рейтинг книги
Барон

Матабар V

Клеванский Кирилл Сергеевич
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар V

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Королева Жанна. Книги 1-3

Олов Нид
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
Королева Жанна. Книги 1-3

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2