Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

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

Шрифт:

07 }

08 }

09 viewport->update;

10 }

Слот recalculate соответствует пункту меню Tools | Recalculate (Инструменты | Пересчитать). Он также вызывается в Spreadsheet автоматически по мере необходимости.

Мы выполняем цикл по всем ячейкам и вызываем функцию setDirty, которая помечает каждую из них для перерасчета значения. В следующий раз, когда QTableWidget для получения отображаемого в электронной таблице значения вызовет text для некоторой ячейки Cell, значение этой ячейки будет пересчитано.

Затем мы вызываем для области отображения функцию update для перерисовки всей электронной таблицы. При этом используемый в QTableWidget программный код по перерисовке вызывает функцию text для каждой видимой ячейки для получения отображаемого значения. Поскольку функция setDirty вызывалась нами для каждой ячейки, в вызовах text будет использовано новое рассчитанное значение. В этом случае может потребоваться расчет невидимых ячеек, который будет проводиться до тех пор, пока не будут рассчитаны все ячейки, влияющие на правильное отображение текста в перерассчитанной области отображения. Этот расчет выполняется в классе Cell.

01 void Spreadsheet::setAutoRecalculate(bool recalc)

02 {

03 autoRecalc = recalc;

04 if (autoRecalc)

05 recalculate;

06 }

Слот setAutoRecalculate соответствует пункту меню Options | Auto—Recalculate. Если эта опция включена, мы сразу же пересчитаем всю электронную таблицу и будем уверены, что она показывает обновленные значения; впоследствии функция recalculate будет автоматически вызываться из somethingChanged.

Нам не нужно реализовывать специальную функцию для пункта меню Options | Show Grid, поскольку в QTableWidget уже содержится слот setShowGrid, который наследуется от базового класса QTableView. Остается только реализовать функцию Spreadsheet::sort, которая вызывается из MainWindow::sort:

01 void Spreadsheet::sort(const SpreadsheetCompare &compare)

02 {

03 QList<QStringList> rows;

04 QTableWidgetSelectionRange range = selectedRange;

05 int i;

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

07 QStringList row;

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

09 row.append(formula(range.topRow + i,

10 range.leftColumn + j));

11 rows.append(row);

12 }

13 qStableSort(rows.begin, rows.end, compare);

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

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

16 setFormula(range.topRow + i, range.leftColumn + j, rows[i][j]);

17 }

18 clearSelection;

19 somethingChanged;

20 }

Сортировка работает на текущей выделенной области и переупорядочивает строки в соответствии со значениями ключей порядка сортировки, хранящимися в объекте compare. Мы представляем каждую строку данных в QStringList, а выделенную область храним в виде списка строк. Мы используем алгоритм Qt qStableSort и для простоты сортируем по выражениям формул, а не по их значениям. Стандартные алгоритмы и структуры данных Qt рассматривается в главе 11 («Классы—контейнеры»).

Рис. 4.8. Хранение выделенной области в виде списка строк.

В качестве аргументов функции qStableSort используются итератор начала, итератор конца и функция сравнения. Функция сравнения имеет два аргумента (оба имеют тип QStringLists), и она возвращает true, когда первый аргумент «больше, чем» второй аргумент, и false в противном случае. Передаваемый как функция сравнения объект compare фактически не является функцией, но он может использоваться и в таком качестве, в чем мы вскоре сможем убедиться.

Рис. 4.9. Помещение данных в таблицу после сортировки.

После выполнения функции qStableSort мы помещаем данные обратно в таблицу, сбрасываем выделение области и вызываем функцию somethingChanged. Класс SpreadsheetCompare в spreadsheet.h определен следующим образом:

01 class SpreadsheetCompare

02 {

03 public:

  • Читать дальше
  • 1
  • ...
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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