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), которая возвращает квадрат переданного ей значения параметра


<< назад вперед >>