foreach (QWidget *win, QApplication::topLevelWidgets()) {
if (MainWindow *mainWin = qobject_cast<MainWindow *>(win))
mainWin->updateRecentFileActions();
}
Здесь используется конструкция Qt foreach (она рассматривается в главе 11) для прохода по всем имеющимся в приложении виджетам и делается вызов функции updateRecentFileItems() для всех виджетов типа MainWindow. Аналогичным образом можно синхронизировать установку опций ShowGrid и Auto—Recalculate или убедиться в том, что не загружены два файла с одинаковым именем.
Рис. 3.17. Однодокументный и многодокументный интерфейсы.
Приложения, обеспечивающие работу с одним документом в главном окне, называются приложениями с однодокументным интерфейсом (SDI — single document interface). Распространенной альтернативой ему в Windows стал многодокументный интерфейс (MDI — multiple document interface), когда приложение имеет одно главное окно, в центральной области которого могут находиться окна многих документов. С помощью средств разработки Qt можно создавать как приложения SDI, так и приложения MDI на всех поддерживаемых платформах. На рис. 3.17 показан вид приложения Электронная таблица при использовании обоих подходов. Интерфейс MDI рассматривается в главе 6 («Управление компоновкой»).
Экранные заставки
Многие приложения при запуске выводят на экран заставки. Некоторыми разработчиками заставки используются, чтобы сделать менее заметным медленный запуск приложения, а в других случаях это делается для удовлетворения требований отделений, отвечающих за маркетинг. Можно очень просто добавить заставку в приложение Qt, используя класс QSplashScreen.
Класс QSplashScreen выводит на экран изображение до появления главного окна. Он также может вывести на изображение сообщение, информирующее пользователя о ходе процесса инициализации приложения. Обычно вызов заставки делается в функции main() до вызова функции QApplication::exec().
Ниже приводится пример функции main(), которая использует QSplashScreen для вывода заставки приложения, которое загружает модули и устанавливает сетевые соединения при запуске.
01 int main(int argc, char *argv[])
02 {
03 QApplication app(argc, argv);
04 QSplashScreen *splash = new QSplashScreen;
05 splash->setPixmap(QPixmap(":/images/splash.png"));
06 splash->show();
07 Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
08 splash->showMessage(QObject::tr("Setting up the main window…"),
09 topRight, Qt::white);
10 MainWindow mainWin;
11 splash->showMessage(QObject::tr("Loading modules…"),
12 topRight, Qt::white);
13 loadModules();
14 splash->showMessage(QObject::tr("Establishing connections…"),
15 topRight, Qt::white);
16 establishConnections();
17 mainWin.show();
18 splash->finish(&mainWin);
19 delete splash;
20 return app.exec();
21 }
Рис. 3.18. Экранная заставка.
Теперь мы завершили пользовательский интерфейс приложения Электронная таблица. В следующей главе мы реализуем базовые функции электронной таблицы и на этом завершим построение этого приложения.
Глава 4. Реализация функциональности приложения
В двух предыдущих главах мы показали способы создания пользовательского интерфейса приложения Электронная таблица. В данной главе мы завершим программирование функций, обеспечивающих работу этого интерфейса. Кроме того, мы рассмотрим способы загрузки и сохранения файлов, хранения данных в памяти, реализации операций с буфером обмена (clipboard) и добавления поддержки формул электронной таблицы к классу QTableWidget.
Центральный виджет
Центральную область QMainWindow может занимать любой виджет. Ниже дается краткий обзор возможных вариантов.
1. Стандартный виджет Qt
В качестве центрального могут использоваться стандартные виджеты, например QTableWidget или QTextEdit. В данном случае такие функции, как загрузка и сохранение файлов, должны быть реализованы в другом месте (например, в подклассе QMainWindow).