Работа со многими документами
Работа со многими документами
Теперь мы готовы написать функцию main() приложения Электронная таблица:
01 #include <QApplication>
02 #include "mainwindow.h"
03 int main(int argc, char *argv[])
04 {
05 QApplication app(argc, argv);
06 MainWindow mainWin;
07 mainWin.show();
08 return app.exec();
09 }
Данная функция main() немного отличается от написанных ранее: мы создали экземпляр MainWindow в виде переменной стека, а не использовали оператор new. Экземпляр MainWindow будет автоматически уничтожен после завершения функции.
При применении данной функции main() приложение Электронная таблица обеспечивает вывод на экран только одного главного окна и позволяет работать только с одним документом. Если мы хотим одновременно редактировать несколько документов, нам придется запускать несколько приложений Электронная таблица. Но это будет не так удобно, как если бы один экземпляр приложения обеспечивал вывод на экран многих главных окон, подобно тому как один экземпляр веб-браузера позволяет просматривать одновременно несколько окон.
Мы модифицируем приложение Электронная таблица для обеспечения возможности работы со многими документами. Для начала нам потребуется немного видоизменить меню File:
• пункт меню File | New создает новое главное окно с пустым документом вместо повторного использования существующего главного окна;
• пункт меню File | Close закрывает текущее главное окно;
• пункт меню File | Exit закрывает все окна.
Рис. 3.16. Новое меню File.
В первоначальной версии меню File не было пункта Close (закрыть), поскольку он выполнял бы ту же функцию, что и пункт меню Exit. Новая функция main() примет следующий вид:
01 int main(int argc, char *argv[])
02 {
03 QApplication app(argc, argv);
04 MainWindow *mainWin = new MainWindow;
05 mainWin->show();
06 return app.exec();
07 }
При работе со многими окнами теперь имеет смысл создавать MainWindow оператором new, потому что затем мы можем использовать оператор delete для удаления главного окна после завершения работы с ним с целью экономии памяти.
Новый слот MainWindow::newFile() будет выглядеть следующим образом:
01 void MainWindow::newFile()
02 {
03 MainWindow *mainWin = new MainWindow;
04 mainWin->show();
05 }
Мы просто создаем новый экземпляр MainWindow. Может показаться странным, что мы нигде не сохраняем указатель на новое окно, но это не составит проблемы, поскольку Qt отслеживает все окна.
Действия Close и Exit будут задаваться следующим образом:
01 void MainWindow::createActions()
02 {
03 closeAction = new QAction(tr("&Close"), this);
04 closeAction->setShortcut(tr("Ctrl+W"));
05 closeAction->setStatusTip(tr("Close this window"));
06 connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
07 exitAction = new QAction(tr("E&xit"), this);
08 exitAction->setShortcut(tr("Ctrl+Q"));
09 exitAction->setStatusTip(tr("Exit the application"));
10 connect(exitAction, SIGNAL(triggered()),
11 qApp, SLOT(closeAllWindows()));
12 }
Слот closeAllWindows() объекта QApplication закрывает все окна приложения, если только никакое из них не отклоняет запрос (event) на его закрытие. Именно такой режим работы нам здесь нужен. Нам не надо беспокоиться о несохраненных изменениях, поскольку обработка этого события выполняется функцией MainWindow::closeEvent() при каждом закрытии окна.
Можно подумать, что на этом завершается построение приложения, работающего со многими документами. К сожалению, одна проблема оказалась незамеченной. Если пользователь будет постоянно создавать и закрывать главные окна, в конце концов может не хватить памяти компьютера. Это происходит из-за того, что мы создаем виджеты MainWindow в функции newFile(), но никогда не удаляем их. Когда пользователь закрывает главное окно, оно исчезает с экрана, но по-прежнему остается в памяти. При создании многих окон может возникнуть проблема.
Решение состоит в установке признака Qt::WA_DeleteOnClose в конструкторе:
01 MainWindow::MainWindow()
02 {
03 setAttribute(Qt::WA_DeleteOnClose);
04 }
Это указывает Qt на необходимость удаления окна при его закрытии. Кроме Qt::WA_DeleteOnClose в конструкторе QWidget можно устанавливать много других флажков, задавая необходимый режим работы виджета.
Утечка памяти — не единственная проблема, с которой мы можем столкнуться. В нашем первоначальном проекте приложения подразумевалось, что у нас будет только одно главное окно. При работе со многими окнами каждое главное окно будет иметь свой список файлов, открывавшихся последними, и свои параметры работы. Очевидно, что список последних открывавшихся файлов должен относиться ко всему приложению. Это можно обеспечить очень просто путем объявления статической переменной recentFiles, и тогда во всем приложении будет только один ее экземпляр. Но здесь мы должны обеспечить при каждом вызове функции updateRecentFileActions() для обновления меню File вызов ее для всех главных окон. Это выполняет следующий программный код:
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 («Управление компоновкой»).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Основные действия с веб-документами
Основные действия с веб-документами Чтобы приступить к заполнению веб-страницы контентом, ее необходимо сначала создать. Чтобы просмотреть и, при необходимости – отредактировать исходный код созданного ранее веб-документа, его нужно открыть. А чтобы не потерять
3.3. Совместная работа с документами
3.3. Совместная работа с документами И последней темой, которую мы рассмотрим в рамках данной главы книги, будет описание способов совместной одновременной работы над документами. Программы для такой работы можно назвать наиболее сложными, ведь они должны предоставлять
16.3.8. Директивы для работы с многоязычными документами
16.3.8. Директивы для работы с многоязычными документами Если ваш сайт имеет несколько языковых версий — например, русскую и английскую, — целесообразно настроить директивы управления языком. Тогда пользователю не нужно будет щелкать по ссылкам «In English/Ha Русском» —
Временные диаграммы для цепей переменного тока со многими источниками гармонического сигнала
Временные диаграммы для цепей переменного тока со многими источниками гармонического сигнала Решим теперь предыдущую задачу, применяя компоненты VSIN вместо VAC для источников напряжения V1, V2 и V3. При этом проводится исследование переходного процесса во временной области.
2.9. Режим структуры и работа с большими документами
2.9. Режим структуры и работа с большими документами Любую работу гораздо проще выполнять, разделив ее на части. В особенности такой принцип подходит для написания реферата, научной, курсовой или дипломной работы. Разделив задачу на несколько подзадач, вам будет проще
3.5. Работа с PDF-документами
3.5. Работа с PDF-документами Формат PDF стал одним из наиболее популярных форматов хранения электронных текстов. Поэтому инструменты конвертации PDF-файлов всегда актуальны.Aldos Text-PDF PRO+Программа Aldos Text-PDF PRO+ (http://www.aldostools.com/pdf.html) предназначена для быстрой конвертации текстовых
Глава 8 Работа с документами
Глава 8 Работа с документами Как и в большинстве программ, для работы нам потребуется документ – файл, в котором хранится вся информация о данной работе. Сначала мы создаем новый файл (либо с нуля, либо на основе какого-то имеющегося файла), сохраняем его под новым именем и
2.2. Одновременная работа с несколькими документами
2.2. Одновременная работа с несколькими документами Microsoft Word позволяет работать с несколькими документами одновременно. При этом каждый новый документ открывается в отдельном окне, а пользователь, работая в полноэкранном режиме, видит только последний открытый документ.
Глава 1 Интерфейс Excel 2007 и работа с документами
Глава 1 Интерфейс Excel 2007 и работа с документами Что же такое Excel и зачем нужна эта программа Excel – это мощнейший вычислительный инструмент, хранилище упорядоченных данных, средство для создания различных графиков, расписаний, диаграмм и т. д. Программа Excel может частично
2.7. Работа с большими документами и режим структуры
2.7. Работа с большими документами и режим структуры Любую работу гораздо проще выполнять, разделив ее на несколько частей. Это справедливо и для проведения рекламной кампании, и для уборки в квартире. В особенности такой принцип подходит для написания научной или
Работа с большими документами
Работа с большими документами Чаще всего при работе с большим текстом его разбивают на части и размещают в отдельных файлах. Правда, в этом случае возникает проблема с нумерацией страниц, ведь если какой-то раздел нужно дописать или, наоборот, сократить, нумерация в
Глава 19 Работаем с документами всерьез
Глава 19 Работаем с документами всерьез Из этой главы вы узнаете:© Как открывать и создавать документы в веб-приложениях Google.© Что такое PDF.© Как пользоваться онлайн-переводчиками Google и Bing.Самыми богатыми возможностями обладают редакторы, входящие в офисные пакеты
Работа с документами в среде Flash
Работа с документами в среде Flash Теперь давайте поговорим о том, как во Flash выполняется работа с документами, а потом плавно перейдем к рассмотрению окна документа и основных принципов создания
Работа с документами
Работа с документами Пользователям компьютеров постоянно приходится работать с документами: текстами, таблицами, рисунками и др. Существует большое количество различных типов документов и соответствующих программ для их обработки. Хотя для каждого типа документов
Режимы работы с документами
Режимы работы с документами Один и тот же документ может отображаться в Word по-разному, в зависимости от выбранного режима просмотра. Режимы переключаются с помощью кнопок вкладки Вид (см. рис. 5.7) или кнопок в правой части строки состояния (рис. 5.9).Рассмотрим назначение