Читаем QT 4: программирование GUI на С++ полностью

При применении данной функции 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 можно устанавливать много других флажков, задавая необходимый режим работы виджета.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных