Application Main Window

概述

下列类提供典型的应用程序主窗口所需的一切, 如主窗口, 菜单, 工具栏, 状态栏等.

QAction

抽象的UI动作类, 它可以插入widget

QActionGroup

动作分组类

QWidgetAction

,通过一个接口扩展 QAction以便实现将自定义widget插入基于容器的动作, 如工具栏

QDockWidget

这个widget可以停靠在QMainWindow内或作为顶层窗口浮动在桌面上

QMainWindow

主窗口

QMdiArea

MDI窗口的区域

QMdiSubWindow

QMdiArea的子窗口类

QMenu

菜单, 用于菜单栏, 内容菜单和其他弹出菜单

QMenuBar

横向菜单

QSizeGrip

调整顶层窗口大小的句柄

QStatusBar

水平状态栏, 显示状态信息

QToolBar

工具栏, 包含一组操作的容器

主窗口类

Qt 提供以下类, 用于管理主窗口和关联的UI部分:

  • QMainWindow 是应用程序创建的核心类. QMainWindow, QDockWidgetQToolBar 组成应用程序的顶级UI.
  • QDockWidget 是一个可以创建可分离的工具条或帮助窗口的widget. 它追踪自己的属性, 这些属性可以作为扩展窗口移动, 关闭或浮动.
  • QToolBar 提供一个通用的工具栏widget, 它可以包含许多不同的, 与动作关联的widget, 如按钮, 下拉菜单, 组合框和数字调整框. 由于Qt采用统一动作模型, 因此工具栏,菜单及键盘快捷键可以很好地配合.

示例代码

使用 QMainWindow 很简单. 一般而言, 我们子类化 QMainWindow , 并在QMainWindow的构造函数中设置菜单, 工具栏和停靠窗口.

我们可以创建一个QMenu, 然后加入到主窗口的菜单. 注意: 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, &QAction::triggered, this, &MainWindow::newFile);

      openAct = new QAction(tr("&Open..."), this);
      openAct->setShortcuts(QKeySequence::Open);
      openAct->setStatusTip(tr("Open an existing file"));
      connect(openAct, &QAction::triggered, this, &MainWindow::open);
      ...

我们可以创建一个QAction, 加入到主窗口的相关widget(如菜单, 工具栏等). 下列示例中, 我们添加到弹出菜单:


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

QToolBarQMenu 利用Qt的动作系统提供便捷API. 在上述代码中, 我们调用 QMenu::addAction() 函数将一些已创建的QAction加入菜单. QToolBar 也提供这个函数, 实现将相同的QAction加入主界面的不同组成部分. 这样可以避免不必要的重复工作.

我们创建一个工具栏, 作为主窗口的子类, 然后加入一些QAction:


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

上述示例, 工具栏初始位置在主窗口的顶部, 但是也能移动到主窗口的底部. 我们可以看到 newActopenAct 同时出现在工具栏和菜单上.

QDockWidgetQToolBar类似. 下列示例中, 我们创建一个停靠widget, 作为主窗口的子类, 并在其上增加一个子类widget:


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

上述示例中, QDockWidget仅能停靠在左右两边, 初始位置在左边.

QMainWindow API 允许开发人员自定义停靠widget占据停靠区域的哪个角. 我们可以调用 QMainWindow::setCorner() 函数改变默认设置:


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

下图显示了由上述代码生成的配置. 注意: 在这个布局中, 左侧和右侧的停靠widget占据主窗口的上下角.

设置完主窗口的所有widget后, 通过如下方式创建主窗口的中心widget:


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

中心widget是 QWidget 的任意派生类.