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

08 windowMenu->addAction(cascadeAction);

09 windowMenu->addSeparator;

10 windowMenu->addAction(nextAction);

11 windowMenu->addAction(previousAction);

12 windowMenu->addAction(separatorAction);

13 }

Закрытая функция createMenus заполняет меню Window командами. Здесь используются типичные для такого рода меню команды, и они легко реализуются с применением слотов closeActiveWindow, closeAllWindows, tile и cascade класса QWorkspace. Всякий раз, когда пользователь открывает новое окно, в меню Window добавляется список действий. (Это делается в функции createEditor, которую мы видели.) При закрытии пользователем окна редактора соответствующий ему пункт в меню Window удаляется (поскольку его владельцем является это окно редактора), т.е. пункт меню удаляется из меню Window автоматически.

01 void MainWindow::closeEvent(QCloseEvent *event)

02 {

03 workspace->closeAllWindows;

04 if (activeEditor) {

05 event->ignore;

06 } else {

07 event->accept;

08 }

09 }

Функция closeEvent переопределяется для закрытия всех дочерних окон, обеспечивая получение всеми дочерними виджетами сигнала о возникновении события закрытия. Если один из дочерних виджетов «игнорирует» свое событие закрытия (прежде всего из-за того, что пользователь нажал кнопку отмены при выдаче соответствующего сообщения о «несохраненных изменениях»), мы игнорируем событие закрытия для MainWindow; в противном случае мы принимаем его, и в результате Qt закрывает окно. Если бы мы не переопределили функцию closeEvent в MainWindow, у пользователя не было бы никакой возможности сохранения ни одного из несохраненных изменений.

Теперь мы закончили наш обзор MainWindow, и поэтому мы можем перейти к реализации класса Editor. Класс Editor представляет одно дочернее окно. Он наследует QTextEdit, который обеспечивает функциональность текстового редактора. Точно так же, как любой виджет, который может использоваться в качестве автономного окна, он может использоваться и в качестве дочернего окна в рабочем пространстве интерфейса MDI.

Ниже приводится определение класса:

01 class Editor : public QTextEdit

02 {

03 Q_OBJECT

04 public:

05 Editor(QWidget *parent = 0);

06 bool openFile(const QString &fileName);

07 bool save;

08 bool saveAs;

09 void newFile;

10 bool open;

11 protected:

12 QSize sizeHint const;

13 QAction *windowMenuAction const { return action; }

14 void closeEvent(QCloseEvent *event);

15 private slots:

16 void documentWasModified;

17 private:

18 bool okToContinue;

19 bool saveFile(const QString &fileName);

20 void setCurrentFile(const QString &fileName);

21 bool readFile(const QString &fileName);

22 bool writeFile(const QString &fileName);

23 QString strippedName(const QString &fullFileName);

24 QString curFile;

25 bool isUntitled;

26 QString fileFilters;

27 QAction *action;

28 }

Присутствующие в классе MainWindow приложения Электронная таблица четыре закрытые функции имеются также в классе Editor: okToContinue, saveFile, setCurrentFile и strippedName.

01 Editor::Editor(QWidget *parent)

02 : QTextEdit(parent)

03 {

04 action = new QAction(this);

05 action->setCheckable(true);

06 connect(action, SIGNAL(triggered), this, SLOT(show));

07 connect(action, SIGNAL(triggered), this, SLOT(setFocus));

08 isUntitled = true;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже