QT 4: программирование GUI на С++ | страница 58
>21 spreadsheet->sort(compaге);
>22 }
>23 }
Порядок действий при программировании функции sort() аналогичен порядку действий, применяемому при программировании функции goToCell();
• мы создаем диалоговое окно в стеке и инициализируем его;
• мы вызываем диалоговое окно при помощи функции exec();
• если пользователь нажимает кнопку OK, мы используем введенные пользователем в диалоговом окне значения соответствующим образом.
Вызов setColumnRange() задает столбцы, выбранные для сортировки. Например, при выделении области, показанной на рис. 3.14, функция range.leftColumn() возвратит 0, давая в результате 'A' + 0 = 'A', a range.rightColumn() возвратит 2, давая в результате 'A' + 2 = 'C'.
В объекте compare хранятся первичный, вторичный и третичный ключи, а также порядок сортировки по ним. (Определение класса SpreadsheetCompare мы рассмотрим в следующей главе.) Этот объект используется функцией Spreadsheet::sort() для сортировки строк. В массиве keys содержатся номера столбцов ключей. Например, если выбрана область с C2 по E5, то столбец С будет иметь индекс 0. В массиве ascending в переменных типа bool хранятся значения направления сортировки для каждого ключа. Функция QComboBox::currentIndex() возвращает индекс текущего элемента (начиная с 0). Для вторичного и третичного ключей мы вычитаем единицу из текущего элемента, чтобы учесть значения «None» (отсутствует).
Функция sort() сделает свою работу, но она не совсем надежна. Она предполагает определенный способ реализации диалогового окна, а именно использование выпадающих списков и элементов со значением «None». Это означает, что при изменении дизайна диалогового окна Sort нам, возможно, потребуется изменить также программный код. Такой подход можно использовать для диалогового окна, применяемого только в одном месте; однако это может вызвать серьезные проблемы сопровождения, если это диалоговое окно станет использоваться в различных местах.
Более надежным будет такой подход, когда класс SortDialog делается более «разумным» и может создавать свой собственный объект SpreadsheetCompare, доступный вызывающему его компоненту. Это значительно упрощает функцию MainWindow::sort():
>01 void MainWindow::sort()
>02 {
>03 SortDialog dialog(this);
>04 QTableWidgetSelectionRange range = spreadsheet->selectedRange();
>05 dialog.setColumnRange('A' + range.leftColumn(),
>06 'А' + range.rightColumn());
>07 if (dialog.exec())