QT 4: программирование GUI на С++ | страница 59



>08 spreadsheet->performSort(dialog.comparisonObject());

>09 }

Такой подход приводит к созданию слабо связанных компонентов, и выбор его почти всегда будет правилен для диалоговых окон, которые вызываются из нескольких мест.

Более «радикальный» подход мог бы заключаться в передаче указателя на объект Spreadsheet при инициализации объекта SortDialog и разрешении диалоговому окну работать непосредственно с объектом Spreadsheet. Это значительно снизит универсальность диалогового окна SortDialog, поскольку оно будет работать только с виджетами определенного типа, но это позволит еще больше упростить программу из-за возможности исключения функции SortDialog::setColumnRange(). В этом случае функция MainWindow::sort() примет следующий вид:

>01 void MainWindow::sort()

>02 {

>03 SortDialog dialog(this);

>04 dialog.setSpreadsheet(spreadsheet);

>05 dialog.exec();

>06 }

Этот подход является зеркальным отражением первого: вместо знания вызывающим компонентом характерных особенностей диалогового окна теперь само диалоговое окно должно иметь представление об особенностях структур данных, передаваемых вызывающим компонентом. Этот подход полезно применять, когда диалоговому окну требуется отслеживать изменения. В то время как при первом подходе ненадежен код вызвавшего компонента, третий подход перестает работать при изменении структуры данных.

Некоторые разработчики выбирают один из подходов и всегда следуют ему. При этом разработка диалоговых окон становится более привычным и простым делом, однако достоинства других подходов не будут использованы. В идеале решение по выбору конкретного подхода должно учитывать в каждом случае особенности конкретного диалогового окна.

Мы завершим данный раздел созданием диалогового окна About (справка о программе). Мы могли бы создать для представления данных о программе специальное диалоговое окно наподобие созданных нами ранее Find или Go-to-Cell, но поскольку диалоговые окна About сильно стилизованы, в средствах разработки Qt предусмотрено простое решение:

>01 void MainWindow::about()

>02 {

>03 QMessageBox::about(this, tr("About Spreadsheet"),

>04 tr("

Spreadsheet 1.1

"

>05 "

Copyright © 2006 Software Inc."

>06 "

Spreadsheet is a small application that "

>07 "demonstrates QAction, QMainWindow, QMenuBar, "

>08 "QStatusBar, QTableWidget, QToolBar, and many other "