[Предыдущая: Классы работы с текстом Scribe] [Начало] [Следующая: Новый Qt Designer]
Классы главного окна в Qt 4
Qt 4 предоставляет новый набор классов главного окна, которые превосходят подобные в Qt 3, обеспечивая большую эффективность при сохранении удобства в использовании.
Обзор классов главного окна
Классы, связанные с главным окном, были полностью переработаны для того, чтобы удовлетворить множеству требований и разрешить проблемы, с которыми столкнулись наши клиенты и внутренние разработчики. Цель данного перепроектирования - обеспечить более последовательную и эффективную структуру управления главным окном.
Классы главного окна в Qt 4
Qt 4 предоставляет следующие классы для управления главным окном и связанными с ним компонентами пользовательского интерфейса:
- QMainWindow остается центральным классом, вокруг которого может быть построено приложение. Интерфейс данного класса был упрощен и многие функциональные возможности перенесены в классы QDockWidget и QToolBar.
- QDockWidgetпредоставляет виджет, который может быть использован для создания перемещаемых панелей инструментов или окон помощи. Встроенный виджет хранит сведения о себе и может быть перемещен, закрыт или использован как внешнее окно.
- QToolBar представляет собой родовой виджет панели инструментов и может содержать множество различных виджетов, связанных с выполнением каких-либо действий, таких как кнопки, выпадающие меню, выпадающие списки и счетчики. Упор в Qt 4 на объединение действий привел к удобному взаимодействию панелей инструментов с горячими клавишами клавиатуры и меню.
Примеры кода
Прямое использование QMainWindow. Вообще, мы создаем подклассы QMainWindow и устанавливаем меню, панели инструментов и встроенные виджеты внутри конструктора QMainWindow.
Чтобы добавить панель меню к главному окну, мы просто создаем меню и добавляем его в панель меню главного окна. Обратите внимание, что функция QMainWindow::menuBar() автоматически создает панель меню при первом вызове. Вы также можете вызвать QMainWindow::setMenuBar() для того, чтобы использовать собственное меню в главном окне.
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
...
newAct = new QAction(tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
openAct = new QAction(tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
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 © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|