Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

[Предыдущая: Классы работы с текстом Scribe] [Начало] [Следующая: Новый Qt Designer]

Классы главного окна в Qt 4

Qt 4 предоставляет новый набор классов главного окна, которые превосходят подобные в Qt 3, обеспечивая большую эффективность при сохранении удобства в использовании.

Обзор классов главного окна

Классы, связанные с главным окном, были полностью переработаны для того, чтобы удовлетворить множеству требований и разрешить проблемы, с которыми столкнулись наши клиенты и внутренние разработчики. Цель данного перепроектирования - обеспечить более последовательную и эффективную структуру управления главным окном.

Классы главного окна в Qt 4

Qt 4 предоставляет следующие классы для управления главным окном и связанными с ним компонентами пользовательского интерфейса:

Примеры кода

Прямое использование QMainWindow. Вообще, мы создаем подклассы QMainWindow и устанавливаем меню, панели инструментов и встроенные виджеты внутри конструктора QMainWindow.

Чтобы добавить панель меню к главному окну, мы просто создаем меню и добавляем его в панель меню главного окна. Обратите внимание, что функция QMainWindow::menuBar() автоматически создает панель меню при первом вызове. Вы также можете вызвать QMainWindow::setMenuBar() для того, чтобы использовать собственное меню в главном окне.

 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
 {
     ...
     newAct = new QAction(tr("&New"), this);
     newAct->setShortcut(tr("Ctrl+N"));
     newAct->setStatusTip(tr("Create a new file"));
     connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

     openAct = new QAction(tr("&Open..."), this);
     openAct->setShortcut(tr("Ctrl+O"));
     openAct->setStatusTip(tr("Open an existing file"));
     connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
     ...

Как только действия созданы, их можно связать с компонентами главного окна. Для начала добавляем их к выпадающим меню:

     fileMenu = menuBar()->addMenu(tr("&File"));
     fileMenu->addAction(newAct);
     fileMenu->addAction(openAct);
     ...
     fileMenu->addSeparator();
     ...

Классы QToolBar и QMenu используют систему действий Qt для поддержания последовательного API. В вышеприведенном коде некоторые действия были добавлены в меню с помощью функции QMenu::addAction(). QToolBar также поддерживает эту функцию, облегчая повторное использование действий в различных частях главного окна. Это избавляет от ненужного повторения кода.

Мы создаем дочернее по отношению к главному окну меню и добавляем в него нужные действия:

     fileToolBar = addToolBar(tr("File"));
     fileToolBar->addAction(newAct);
     fileToolBar->addAction(openAct);
     ...
     fileToolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
     addToolBar(Qt::TopToolBarArea, fileToolbar);

В данном примере расположение панели инструментов ограничено верхней и нижней частями главного окна и первоначально она располагается сверху. Мы можем видеть, что действия, определенные как newAct и openAct, будут отображены и в меню, и на панели инструментов.

QDockWidget используется подобно QToolBar. Мы создаем встроенный виджет как дочерний по отношению к главному окну и добавляем в него виджеты, дочерние по отношению к встроенному виджету:

     contentsWindow = new QDockWidget(tr("Table of Contents"), this);
     contentsWindow->setAllowedAreas(Qt::LeftDockWidgetArea
                                   | Qt::RightDockWidgetArea);
     addDockWidget(Qt::LeftDockWidgetArea, contentsWindow);

     headingList = new QListWidget(contentsWindow);
     contentsWindow->setWidget(headingList);

В данном примере месторасположение встроенного виджета ограничено левой и правой областью прикрепляемых виджетов, а первоначально он располагается слева.

API QMainWindow позволяет программисту настраивать, какие встраиваемые виджеты какой угол занимают и как они состыковываются. Если требуется, положение по умолчанию может быть изменено с помощью QMainWindow::setCorner():

 setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
 setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
 setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
 setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);

Вышеприведенная диаграмма демонстрирует, как изменятся области встраиваемых виджетов после выполнения данного кода. Обратите внимание, что левая и правая область встраиваемых виджетов займет верхние и нижние углы главного окна.

После того, как созданы все компоненты главного окна, приступаем к созданию центрального виджета с помощью следующего кода:

 QWidget *centralWidget = new QWidget(this);
 setCentralWidget(centralWidget);

Центральный виджет может быть любым из подклассов QWidget.

Что изменилось по сравнению с Qt 3?

В Qt 4 в классы главного окна добавлен новый функционал, преимущественно для встроенных виджетов и панели инструментов. Изменения были сделаны также в структуре библиотеки.

Хотя классQMainWindow в Qt 3 обеспечивал поддержку панелей инструментов, встраиваемых виджетов и прочих стандартных компонентов пользовательского интерфейса, это делалось с помощью большого количества функций-членов QMainWindow. В Qt 4 класс QMainWindow передаёт многие из функций управления в QDockWidget и QToolBar. В результате эти классы в Qt 4 используются слегка различными способами.

Классы встроенных виджетов и панели инструментов сейчас разделены на независимые классы. (и не только)

(Это подразумевает, что данные изменения позволят улучшить поведение и расширить возможности (какой? пример). Основываясь на отзывах пользователей, мы надеемся расширить эти классы в будущем.)

Новый функционал

Стыковка и перетаскивание из области прикрепления встроенных виджетов теперь анимирована. Область прикрепления теперь также корректирует размер виджетов для отображения, где будет располагаться виджет после перемещения. Анимация может быть отключена с помощью setAnimated().

По умолчанию, встраиваемые виджеты добавляются в область прикрепления в отдельные строки. При установке вложенности с помощью setDockNestingEnabled() виджеты могут быть добавлены как вертикально, так и горизонтально.

Два встраиваемых виджета могут занимать одно и то же место в области прикрепления. Пользователь может выбрать, который виджет будет видимым, с помощью вкладок, которые расположены ниже виджетов. Функция QMainWindow::tabifyDockWidget() соединяет две вкладки виджетов в область прикрепления. (пересмотреть весь абзац)

Независимость классов QDockWidget и QToolBar

Функциональные возможности панели инструментов и встроенного окна обеспечиваются двумя независимыми классами: QToolBar и QDockWidget. Панели инструментов и встроенные виджеты располагаются в отдельных областях. Подобное поведение отличается от поведения в Qt 3, где QToolBar наследует функциональные возможности QDockWidget и где компоненты обоих типов располагаются в одних и тех же областях. В результате мы получили более последовательное и предсказуемое поведение. Панели инструментов и встроенные виджеты сохраняют обратную связь в то время, как их перемещают в новую позицию.

Диаграмма, приведенная выше, показывает компоновку главного окна, которое содержит панели инструментов и встроенные виджеты. Каждая из угловых областей может использоваться любой из смежных областей встроенных виджетов, позволяя задавать точное расположение виджетов.

Панели инструментов и встроенные виджеты являются дочерними окнами по отношению к главному окну. Больше нет необходимости удочерять их главным окном. Вместо этого компоновщики используются для управления расположением панелей инструментов и состыковкой виджетов. В результате этого старый класс QDockArea больше не требуется в Qt 4.

Примеры изменений в коде

QMainWindow продолжает поддерживать функцию menuBar(), но меню всегда строится с использованием объектов QAction. Все виды меню построены с использованием общего класса QMenu.

Qt 3:

 QPopupMenu *fileMenu = new QPopupMenu(this);
 openAction->addTo(fileMenu);
 saveAction->addTo(fileMenu);
 ...
 menuBar()->insertItem(tr("&File"), fileMenu);

Qt 4:

 QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
 fileMenu->addAction(openAction);
 fileMenu->addAction(saveAction);
 ...

Панели инструментов создаются подобным образом, обеспечивая новое, более последовательное поведение:

Qt 3:

 QToolBar *fileTools = new QToolBar(this, "file toolbar");
 openAction->addTo(fileTools);
 saveAction->addTo(fileTools);
 ...

Qt 4:

 QToolBar *fileTools = addToolBar(tr("File Tool Bar"));
 fileTools->addAction(openAction);
 fileTools->addAction(saveAction);
 ...

Поведение встроенных виджетов теперь настраивается с помощью членов-функций класса QDockWidget. Например, сравните старый и новый способы создания встроенного виджета в левой части главного окна.

В Qt 3:

 QDockWidget *dockWidget = new QDockWidget(this);
 mainWin->moveDockWidget(dockWidget, Qt::DockLeft);

В Qt 4:

 QDockWidget *dockWidget = new QDockWidget(mainWindow);
 mainWindow->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

[Предыдущая: Классы работы с текстом Scribe] [Начало] [Следующая: Новый Qt Designer]


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5