QT 4: программирование GUI на С++ | страница 62
Работа со многими документами
Теперь мы готовы написать функцию main() приложения Электронная таблица:
>01 #include
>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 отслеживает все окна.