QT 4: программирование GUI на С++ | страница 57
Функция goToCell() отличается от приводимого до сих пор программного кода тем, что она создает виджет (GoToCellDialog) в виде переменной стека. Мы столь же легко могли бы воспользоваться операторами new и delete, что увеличило бы программный код только на одну строку:
>01 void MainWindow::goToCell()
>02 {
>03 GoToCellDialog *dialog = new GoToCellDialog(this);
>04 if (dialog->exec()) {
>05 QString str = dialog->lineEdit->text().toUpper();
>06 spreadsheet->setCurrentCell(str.mid(1).toInt() - 1,
>07 str[0].unicode() - 'A');
>08 }
>09 delete dialog;
>10 }
Создание модальных диалоговых окон (и контекстных меню при переопределении QWidget::contextMenuEvent()) является обычной практикой программирования, поскольку такое окно (или меню) будет не нужно после его использования, и оно будет автоматически уничтожено при выходе из области видимости.
Теперь мы перейдем к созданию диалогового окна Sort. Это диалоговое окно является модальным и позволяет пользователю упорядочить текущую выбранную область, задавая в качестве ключей сортировки определенные столбцы. На рис. 3.14 показан пример сортировки, когда в качестве главного ключа сортировки используется столбец В, а в качестве вторичного ключа сортировки используется столбец А (в обоих случаях сортировка выполняется по возрастанию значений).
Рис. 3.14. Сортировка выделенной области электронной таблицы.
>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()) {
>08 SpreadsheetCompare compare;
>09 compare.keys[0] =
>10 dialog.primaryColumnCombo->currentIndex();
>11 compare.keys[1] =
>12 dialog.secondaryColumnCombo->currentIndex() - 1;
>13 compare.keys[2] =
>14 dialog.tertiaryColumnCombo->currentIndex() - 1;
>15 compare.ascending[0] =
>16 (dialog.primaryOrderCombo->currentIndex() == 0);
>17 compare.ascending[1] =
>18 (dialog.secondaryOrderCombo->currentIndex() == 0);
>19 compare.ascending[2] =
>20 (dialog.tertiaryOrderCombo->currentIndex() == 0);