QTableWidgetSelectionRange range = selectedRangeO; int i;
for (i = 0; i < range. rowCountO; ++i) { QStringList row;
for (int j = 0; j < range.columnCountO; row.append(formula(range.topRow() + i,
range. leftColumnO + j));
rows. append( row);
}
qStableSort(rows.begin(), rows.endO, compare); for (i = 0; i < range. rowCountO; ++i) {
for (int j = 0; j < range.columnCountO; ++j)
setFormula(range.topRow() + i, range.leftColumnO + j, rows[i][j]);
}
clearSelectionO; somethingChangedO;
}
Сортировка работает на текущей выделенной области и переупорядочивает строки в соответствии со значениями ключей порядка сортировки и хранящимися в объекте compare. Мы представляем каждую строку данных в QStringList, а выделенную область храним в виде списка строк. Мы используем алгоритм Qt qStableSort() и для простоты сортируем по выражениям формул, а не по их значениям. Стандартные алгоритмы и структуры данных Qt рассматривается в главе 11 («Классы-контейнеры»).

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

Рис. 4.9. Помещение данных в таблицу после сортировки
После выполнения функции qStableSort() мы помещаем данные обратно в таблицу, сбрасываем выделение области и вызываем функцию somethingChanged(). Класс SpreadsheetCompare в spreadsheet. h определен следующим образом:
class SpreadsheetCompare {
public:
bool operator()(const QStringList &row1, const QStringList &row2) const;
enum { KeyCount = 3 };
int keys[KeyCount];
bool ascending[KeyCount];
};
Класс SpreadsheetCompare является специальным классом, реализующим оператор (). Это позволяет нам применять этот класс в качестве функции. Такие классы называются объектами функций или функторами (functors). Для лучшего понимания работы функторов мы сначала разберем простой пример:
class Square {
public:
int operator()(int x) const { return x * x; }
};
Класс Square содержит одну функцию operator()(int), которая возвращает квадрат переданного ей значения параметра
<< назад вперед >>