Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

ΠœΠ½ΠΎΠ³ΠΎΠ΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΉ интСрфСйс

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ области Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ прилоТСниями с ΠΌΠ½ΠΎΠ³ΠΎΠ΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΌ интСрфСйсом ΠΈΠ»ΠΈ MDI—прилоТСниями. Π’ Qt MDI—прилоТСния ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с использованиСм Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° класса QWorkspace ΠΈ ΠΏΡƒΡ‚Π΅ΠΌ прСдставлСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΎΠΊΠ½Π° QWorkspace.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ MDI—прилоТСния содСрТат ΠΏΡƒΠ½ΠΊΡ‚ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ мСню Windows (ΠΎΠΊΠ½Π°) с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΈ ΠΈΡ… списком. АктивноС ΠΎΠΊΠ½ΠΎ отмСчаСтся Π³Π°Π»ΠΎΡ‡ΠΊΠΎΠΉ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ любоС ΠΎΠΊΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, щСлкая ΠΏΠΎ Π΅Π³ΠΎ названию Π² мСню Windows.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ для дСмонстрации способов создания прилоТСния с интСрфСйсом MDI ΠΈ способов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ мСню Windows ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ MDIβ€”ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Editor (Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€), ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° рис. 6.16.

Рис. 6.16. MDIβ€”ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Editor.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· Π΄Π²ΡƒΡ… классов: MainWindow ΠΈ Editor. Π•Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ находится Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ большая Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ Π»ΠΈΠ±ΠΎ совпадаСт, Π»ΠΈΠ±ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ· части I, здСсь ΠΌΡ‹ прСдставим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Рис. 6.17. МСню MDI—прилоТСния Editor.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с класса MainWindow.

01 MainWindow::MainWindow()

02 {

03 workspace = new QWorkspace;

04 setCentralWidget(workspace);

05 connect(workspace, SIGNAL(windowActivated(QWidget *)),

06 this, SLOT(updateMenus()));

07 createActions();

08 createMenus();

09 createToolBars();

10 createStatusBar();

11 setWindowTitle(tr("MDI Editor"));

12 setWindowIcon(QPixmap(":/images/icon.png"));

13 }

Π’ конструкторС MainWindow ΠΌΡ‹ создаСм Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QWorkspace ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ. ΠœΡ‹ связываСм сигнал windowActivated() класса QWorkspace со слотом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обСспСчСния Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния мСню Window.

01 void MainWindow::newFile()

02 {

03 Editor *editor = createEditor();

04 editor->newFile();

05 editor->show();

06 }

Π‘Π»ΠΎΡ‚ newFile() соотвСтствуСт ΠΏΡƒΠ½ΠΊΡ‚Ρƒ мСню File | New. Он зависит ΠΎΡ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ createEditor(), ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Editor.

01 Editor *MainWindow::createEditor()

02 {

03 Editor *editor = new Editor;

04 connect(editor, SIGNAL(copyAvailable(bool)),

05 cutAction, SLOT(setEnabled(bool)));

06 connect(editor, SIGNAL(copyAvailable(bool)),

07 copyAction, SLOT(setEnabled(bool)));

08 workspace->addWindow(editor);

09 windowMenu->addAction(editor->windowMenuAction());

10 windowActionGroup->addAction(editor->windowMenuAction());

11 return editor;

12 }

Ѐункция createEditor() создаСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Editor ΠΈ устанавливаСт Π΄Π²Π° соСдинСния «сигнал—слот». Π­Ρ‚ΠΈ соСдинСния ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню Edit | Cut ΠΈ Edit | Copy Π² зависимости ΠΎΡ‚ наличия Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области тСкста.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ интСрфСйс MDI, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΡΡ‚ΠΈΡΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с нСсколькими Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Editor. На это Π½Π°Π΄ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ заинтСрСсованы Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π½Π° сигнал copyAvailable(bool), ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Editor, Π½ΠΎ Π½Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΊΠΎΠ½. Но эти сигналы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ, поэтому это практичСски Π½Π΅ составляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

ПослС настройки Editor ΠΌΡ‹ добавляСм QAction для прСдставлСния ΠΎΠΊΠ½Π° Π² мСню Window. Π­Ρ‚ΠΎ дСйствиС обСспСчиваСтся классом Editor, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ скоро рассмотрим. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ добавляСм это дСйствиС Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QActionGroup. QActionGroup Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оказываСтся ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° строка мСню Window.

01 void MainWindow::open()

02 {

03 Editor *editor = createEditor();

04 if (editor->open()) {

05 editor->show();

06 } else {

07 editor->close();

08 }

09 }

Ѐункция open() соотвСтствуСт ΠΏΡƒΠ½ΠΊΡ‚Ρƒ мСню File | Open. Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΠ½ΠΊΡ‚ мСню создаСт Editor для Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ open() для Editor. Π˜ΠΌΠ΅Π΅Ρ‚ смысл Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² классС Editor, Π° Π½Π΅ Π² классС MainWindow, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Editor Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ своСго собствСнного состояния.

Если функция open() Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΌΡ‹ просто Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ ΠΎΠ± ошибкС. ΠœΡ‹ Π½Π΅ обязаны сами явно ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Editor; это происходит автоматичСски ΠΏΡ€ΠΈ условии установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt::WA_DeleteOnClose, Ρ‡Ρ‚ΠΎ ΠΈ дСлаСтся Π² конструкторС Editor.

01 void MainWindow::save()

02 {

03 if (activeEditor()) {

04 activeEditor()->save();

05 }

06 }

Π‘Π»ΠΎΡ‚ save() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Editor::save() для Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ имССтся. И снова ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ находится Π² классС Editor.

01 Editor *MainWindow::activeEditor()

02 {

03 return qobject_cast<Editor *>(workspace->activeWindow());

04 }

Закрытая функция activeEditor() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π΅ ΠΎΠΊΠ½ΠΎ Π² Π²ΠΈΠ΄Π΅ указатСля Ρ‚ΠΈΠΏΠ° Editor ΠΈΠ»ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΈ отсутствии Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

01 void MainWindow::cut()

02 {

03 if (activeEditor())

04 activeEditor()->cut();

05 }

Π‘Π»ΠΎΡ‚ cut() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Editor::cut() для Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°. ΠœΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ слоты copy(), paste() ΠΈ del(), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Π²ΠΈΠ΄.

01 void MainWindow::updateMenus()

02 {

03 bool hasEditor = (activeEditor() != 0);

04 bool hasSelection = activeEditor()

05 && activeEditor()->textCursor().hasSelection();

06 saveAction->setEnabled(hasEditor);

07 saveAsAction->setEnabled(hasEditor);

08 pasteAction->setEnabled(hasEditor);

09 cutAction->setEnabled(hasSelection);

10 copyAction->setEnabled(hasSelection);

11 closeAction->setEnabled(hasEditor);

12 closeAllAction->setEnabled(hasEditor);

13 tileAction->setEnabled(hasEditor);

14 cascadeAction->setEnabled(hasEditor);

15 nextAction->setEnabled(hasEditor);

16 previousAction->setEnabled(hasEditor);

17 separatorAction->setVisible (hasEditor);

18 if (activeEditor())

19 activeEditor()->windowMenuAction()->setChecked(true);

20 }

Π‘Π»ΠΎΡ‚ updateMenus() вызываСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠΊΠ½ΠΎ становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ (ΠΈ ΠΊΠΎΠ³Π΄Π° закрываСтся послСднСС ΠΎΠΊΠ½ΠΎ) для обновлСния систСмы мСню благодаря ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΌΡƒ Π½Π°ΠΌΠΈ Π² конструктор MainWindow соСдинСнию «сигнал—слот».

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΈ сущСствовании Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, поэтому ΠΌΡ‹ ΠΈΡ… ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈ отсутствии Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ setChecked() для QAction, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Благодаря использованию QActionGroup Π½Π°ΠΌ Π½Π΅ трСбуСтся явно ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ ΠΏΡ€Π΅Π΄ΡŒΡ‰ΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

01 void MainWindow::createMenus()

02 {

03 windowMenu = menuBar()->addMenu(tr("&Window"));

04 windowMenu->addAction(closeAction);

05 windowMenu->addAction(closeAllAction);

06 windowMenu->addSeparator();

07 windowMenu->addAction(tileAction);

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, Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности сохранСния Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.