QT 4: программирование GUI на С++
Шрифт:
Рис. 4.8. Хранение выделенной области в виде списка строк.
В качестве аргументов функции qStableSort используются итератор начала, итератор конца и функция сравнения. Функция сравнения имеет два аргумента (оба имеют тип QStringLists), и она возвращает true, когда первый аргумент «больше, чем» второй аргумент, и false в противном случае. Передаваемый как функция сравнения объект compare
Рис. 4.9. Помещение данных в таблицу после сортировки.
После выполнения функции qStableSort мы помещаем данные обратно в таблицу, сбрасываем выделение области и вызываем функцию somethingChanged. Класс SpreadsheetCompare в spreadsheet.h определен следующим образом:
Класс SpreadsheetCompare является специальным классом, реализующим оператор . Это позволяет нам применять этот класс в качестве функции. Такие классы называются объектами функций или функторами (functors).
Для лучшего понимания работы функторов мы сначала разберем простой пример:
Класс Square содержит одну функцию operator(int), которая возвращает квадрат переданного ей значения параметра. Обозначая функцию в виде operator(int), а не в виде, например, compute(int), мы получаем возможность применения объекта типа Square как функции:
Теперь рассмотрим пример с применением объекта SpreadsheetCompare:
Объект compare можно использовать так же, как если бы он был обычной функцией compare. Кроме того, он может быть реализован таким образом, что будет осуществлять доступ ко всем ключам сортировки и всем признакам порядка сортировки, которые хранятся в переменных—членах класса.
Можно использовать другой подход, когда ключи сортировки и признаки порядка сортировки хранятся в глобальных
Ниже приводится реализация функции, которая применяется для сравнения двух строк электронной таблицы:
Этот оператор возвращает 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