Qt:Документация 4.3.2/qt4-mainwindow

Материал из Wiki.crossplatform.ru

Версия от 10:37, 6 ноября 2008; Root (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

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

Image:trolltech-logo.png

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

Содержание

[править] Классы главного окна в Qt 4

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

[править] Обзор классов главного окна

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

[править] Классы главного окна

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->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);

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

center

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

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

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

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

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

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

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

(It is intended that these changes allow more consistent behavior to be defined and implemented (which? example). In response to feedback from customers, we hope to improve these classes even further.)

[править] Новый функционал

Dock widgets are animated when docking or detaching from a dock area. The dock areas will also adjust their size to show where the dock widget will dock when it hovers over it. This animation can be turned off with setAnimated().

By default, dock widgets are added to the dock areas in a single row. By setting nesting enabled with setDockNestingEnabled(), the widgets can be added both vertically and horizontally.

Two dock widgets can occupy the same space in a dock area. The user can then choose which widget that is visible with a tab bar that is located below the widgets. The QMainWindow::tabifyDockWidget() joins two tab widgets in such a tabbed dock area. (revise the entire paragraph)

[править] Независимые классы QDockWidget и QToolBar

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

center

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

Панели инструметров и встроенные виджеты являются дочерними окнами по отношению к главному окну. Больше нет необходимости удочерять их главным окном. Вместо этого компоновщики используются для управления расположением панелей инструметов и состыковкой виджетов. В результате этого старый класс 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. Для примера сравните старый и новый способы создания встраиваемого виджета, располагающегося в левой области встраиваемых виджетов главного окна.

In Qt 3:

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

In Qt 4:

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

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


Copyright © 2007 Trolltech Trademarks
Qt 4.3.2