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

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

Жанры

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

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

Шрифт:

• Если формула представлена числом, именно оно и будет отображаться. Например, формула «1.50» обозначает значение 1.5 типа double, которое отображается в электронной таблице как выровненное вправо значение «1.5».

• Если формула начинается с одиночной кавычки, остальная часть формулы интерпретируется как текст. Например, результатом формулы «'12345» будет строка «12345».

• Если формула начинается со знака равенства («=»), то ее значение интерпретируется как арифметическое выражение. Например, если ячейка A1 содержит «12» и ячейка A2 содержит «6», то результатом формулы «=A1+A2» будет 18. Задача преобразования формулы в значение выполняется классом Cell. Здесь следует иметь в виду, что отображаемый в ячейке текст соответствует значению, полученному в результате расчета формулы, а не является текстом самой формулы.

01 void Spreadsheet::setFormula(int row, int column,
const QString &formula)

02 {

03 Cell *c = cell(row, column);

04 if (!c) {

05 с = new Cell;

06 setItem(row, column, с);

07 }

08 c->setFormula(formula);

09 }

Закрытая функция setFormula задает формулу для указанной ячейки. Если ячейка уже имеет объект Cell, мы его повторно используем. В противном случае мы создаем новый объект Cell и вызываем QTableWidget::setItem для вставки его в таблицу. В конце мы вызываем для этой ячейки функцию setFormula, что приводит к перерисовке ячейки, если она отображается на экране. Нам не надо беспокоиться об удалении в будущем объекта Cell; QTableWidget является собственником ячейки и будет автоматически удалять ее содержимое в нужное время.

01 QString Spreadsheet::currentLocation const

02 {

03 return QChar('A' + currentColumn)

04 + QString::number(currentRow + 1);

05 }

Функция currentLocation возвращает текущее положение ячейки, используя обычную форму представления ее координат в электронной таблице с обозначением буквой положения столбца, за которой идет номер строки. Функция MainWindow::updateStatusBar использует ее для отображения положения ячейки в строке состояния.

01 QString Spreadsheet::currentFormula const

02 {

03 return formula(currentRow, currentColumn);

04 }

Функция currentFormula возвращает формулу текущей ячейки. Она вызывается из функции MainWindow::updateStatusBar.

01 void Spreadsheet::somethingChanged

02 {

03 if (autoRecalc)

04 recalculate;

05 emit modified;

06 }

Закрытый слот somethingChanged делает перерасчет всей электронной таблицы, если включен режим Auto—Recalculate (автоматический пересчет). Он также генерирует сигнал modified.

Загрузка и сохранение

Теперь мы реализуем загрузку и сохранение файла данных для приложения Электронная таблица, используя двоичный пользовательский формат. Для этого мы используем объекты QFile и QDataStream, которые совместно обеспечивают независимый от платформы ввод—вывод в двоичном формате.

Мы начнем с записи файла данных Электронная таблица:

01 bool Spreadsheet::writeFile(const QString &fileName)

02 {

03 QFile file(fileName);

04 if (!file.open(QIODevice::WriteOnly)) {

05 QMessageBox::warning(this, tr("Spreadsheet"),

06 tr("Cannot write file %1:\n%2.")

07 .arg(file.fileName)

08 .arg(file.errorString));

09 return false;

10 }

11 QDataStream out(&file);

12 out.setVersion(QDataStream::Qt_4_1);

13 out << quint32(MagicNumber);

14 QApplication::setOverrideCursor(Qt::WaitCursor);

15 for (int row = 0; row < RowCount; ++row) {

16 for (int column = 0; column < ColumnCount; ++column) {

17 QString str = formula(row, column);

18 if (!str.isEmpty)

19 out << quint16(row) << quint16(column) << str;

20 }

21 }

22 QApplication::restoreOverrideCursor;

23 return true;

24 }

Функция writeFile вызывается из MainWindow::saveFile для записи файла на диск. Она возвращает true при успешном завершении и false при ошибке.

Мы создаем объект QFile, задавая имя файла, и вызываем функцию open для открытия файла для записи данных. Мы также создаем объект QDataStream, который предназначен для работы с QFile и использует его для записи данных.

Непосредственно перед записью данных мы изменяем курсор приложения на стандартный курсор ожидания (обычно он имеет вид песочных часов) и затем восстанавливаем нормальный курсор после окончания записи данных. В конце функции файл автоматически закрывается деструктором QFile.

QDataStream поддерживает основные типы С++ совместно со многими типами Qt. Их синтаксис напоминает синтаксис классов <iostream> стандартного С++. Например,

out << x << у << z;

выполняет запись в поток значений переменных x, у и z, а

in >> x >> у >> z;

считывает их из потока. Поскольку базовые типы С++, такие как char, short, int, long и long long, на различных платформах могут иметь различный размер, надежнее преобразовать их типы в qint8, quint8, qint16, quint16, qint32, quint32, qint64 и quint64, что гарантирует использование объявленного в них размера (в битах).

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

Инженерный Парадокс 9

Cyberdawn
9. Инженерный Парадокс
Фантастика:
боевая фантастика
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Инженерный Парадокс 9

Бастард рода Неллеров. Книга 1

Усов Серг
1. Бастард рода Неллеров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Бастард рода Неллеров. Книга 1

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Геном хищника. Книга пятая

Гарцевич Евгений Александрович
5. Я - Легенда!
Фантастика:
рпг
фэнтези
попаданцы
6.00
рейтинг книги
Геном хищника. Книга пятая

Славянское фэнтези

Семёнова Мария Васильевна
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.80
рейтинг книги
Славянское фэнтези

Последний Паладин

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

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

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

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

Deus vult

Рокотов Алексей
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Deus vult

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Шайтан Иван

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Я Гордый часть 5

Машуков Тимур
5. Стальные яйца
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Я Гордый часть 5