QT 4: программирование GUI на С++
Шрифт:
Класс SpreadsheetCompare является специальным классом, реализующим оператор . Это позволяет нам применять этот класс в качестве функции. Такие классы называются объектами функций или функторами (functors).
Для лучшего понимания работы функторов мы сначала разберем простой пример:
Класс Square
Теперь рассмотрим пример с применением объекта SpreadsheetCompare:
Объект compare можно использовать так же, как если бы он был обычной функцией compare. Кроме того, он может быть реализован таким образом, что будет осуществлять доступ ко всем ключам сортировки и всем признакам порядка сортировки, которые хранятся в переменных—членах класса.
Можно использовать другой подход, когда ключи сортировки и признаки порядка сортировки хранятся в глобальных переменных и используется функция обычного типа compare. Однако связь через глобальные переменные выглядит неизящно и может быть причиной тонких ошибок. Функторы представляют собой более мощное средство связи для таких функций—шаблонов, как qStableSort.
Ниже приводится реализация функции, которая применяется для сравнения двух строк электронной таблицы:
Этот оператор возвращает 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 для отображения результата вычисления формулы ячейки.
Создание подкласса QTableWidgetltem
Класс Cell наследует QTableWidgetltem. Этот класс спроектирован для удобства работы с Spreadsheet, но он не имеет никаких особых связей с данным классом электронной таблицы и теоретически может применяться для любого объекта QTableWidget. Ниже приводится заголовочный файл:
Класс Cell расширяет QTableWidgetltem, добавляя две закрытые переменные: