Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

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

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

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

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

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

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

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

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

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

Данные изменения представляют из себя нечто большее, чем косметические улучшения API Qt. Они позволяют реализовать более последовательное поведение. Мы надеемся улучшать эти классы и далее поддерживая обратную связь с клиентами.

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


Copyright © 2005 Trolltech Trademarks
Qt 4.1.0
Hosted by uCoz