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