Многодокументный интерфейс

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

MainWindow::MainWindow()

{

workspace = new QWorkspace; setCentralWidget(workspace);

connect(workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(updateMenusO));

createActions(); createMenusO; createToolBarsO; createStatusBar();

setWindowTitle(tr("MDI Editor")); setWindowIcon(QPixmap(":/images/icon.png"));

}

В конструкторе MainWindow мы создаем виджет QWorkspace и делаем его централь­ным виджетом. Мы связываем сигнал windowActivated() класса QWorkspace со слотом, который мы будем использовать для обеспечения актуального состояния меню Window.

void MainWindow::newFile() {

Editor *editor = createEditor();

editor->newFile();

editor->show();

Слот newFile() соответствует пункту меню File|New. Он зависит от зарытой функции createEditor(), создающей дочерний виджет Editor.

Editor *MainWindow:: createEditiorO

Editor *editor =.new Editor;

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

cutAction, SLOT(setEnabled(bool))); connect(editor, SIGNAL(copyAvailable(bool)),

copyAction, SLOT(setEnabled(bool)));


<< назад вперед >>