Классы главного окна в Qt 4Qt 4 предоставляет новый набор классов главного окна, которые превосходят подобные в Qt 3, обеспечивая большую эффективность при сохранении удобства в использовании. Обзор классов главного окнаКлассы, связанные с главным окном, были полностью переработаны для того, чтобы удовлетворить множеству требований и разрешить проблемы, с которыми столкнулись наши клиенты и внутренние разработчики. Цель данного перепроектирования - обеспечить более последовательную и эффективную структуру управления главным окном. Классы главного окна в Qt 4Qt 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); |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |