Чтение онлайн

ЖАНРЫ

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

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

Поделиться с друзьями: