Читаем QT 4: программирование GUI на С++ полностью

07 if (row1[column] != row2[column]) {

08 if (ascending[i]) {

09 return row1[column] < row2[column];

10 } else {

11 return row1[column] > row2[column];

12 }

13 }

14 }

15 }

16 return false;

17 }

Этот оператор возвращает true, если первая строка меньше второй; в противном случае он возвращает false. Функция qStableSort() для выполнения сортировки использует результат этой функции.

Массивы keys и ascending объекта SpreadsheetCompare заполняются при работе функции MainWindow::sort() (она приводится в главе 2). Каждый ключ содержит индекс столбца или имеет значение —1 («None» — нет значения).

Мы сравниваем значения соответствующих ячеек двух строк, учитывая порядок ключей сортировки. Как только оказывается, что они различны, мы возвращаем соответствующее значение: true или false. Если все значения оказываются равными, мы возвращаем false. При совпадении значений функция qStableSort() сохраняет порядок до сортировки; если строка row1 располагалась первоначально перед строкой row2 и ни одна из них не оказалась «меньше другой», то в результате строка row1 по-прежнему будет предшествовать строке row2. Именно этим функция qStableSort() отличается от своего нестабильного «родственника» qSort().

Теперь мы закончили класс Spreadsheet. В следующем разделе мы рассмотрим класс Cell. Этот класс применяется для хранения формул ячеек и обеспечивает переопределение функции QTableWidgetltem::data(), которая вызывается в Spreadsheet через функцию QTableWidgetItem::text() для отображения результата вычисления формулы ячейки.

<p>Создание подкласса QTableWidgetltem</p>

Класс Cell наследует QTableWidgetltem. Этот класс спроектирован для удобства работы с Spreadsheet, но он не имеет никаких особых связей с данным классом электронной таблицы и теоретически может применяться для любого объекта QTableWidget. Ниже приводится заголовочный файл:

01 #ifndef CELL_H

02 #define CELL_H

03 #include

04 class Cell : public QTableWidgetltem

05 {

06 public:

07 Cell();

08 QTableWidgetltem *clone() const;

09 void setData(int role, const QVariant &value);

10 QVariant data(int role) const;

11 void setFormula(const QString &formula);

12 QString formula() const;

13 void setDirty();

14 private:

15 QVariant value() const;

16 QVariant evalExpression(const QString &str, int &pos) const;

17 QVariant evalTerm(const QString &str, int &pos) const;

18 QVariant evalFactor(const QString &str, int &pos) const;

19 mutable QVariant cachedValue;

20 mutable bool cacheIsDirty;

21 };

22 #endif

Класс Cell расширяет QTableWidgetltem, добавляя две закрытые переменные:

• переменная cachedValue кэширует значение ячейки в виде значения типа QVariant;

• переменная cacheIsDirty принимает значение true, если кэшируемое значение устарело.

Мы используем QVariant, поскольку некоторые ячейки имеют тип числа двойной точности double, а другие имеют тип строки QString.

При объявлении переменных cachedValue и cacheIsDirty используется ключевое слово mutable языка С++. Это позволяет нам модифицировать эти переменные в функциях с модификатором const. Мы могли бы поступить по-другому и заново выполнять расчет при каждом вызове функции text(), но эта неэффективность будет не оправдана.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных