Application Main Window
概述
下列类提供典型的应用程序主窗口所需的一切, 如主窗口, 菜单, 工具栏, 状态栏等.
抽象的UI动作类, 它可以插入widget | |
动作分组类 | |
,通过一个接口扩展 QAction以便实现将自定义widget插入基于容器的动作, 如工具栏 | |
这个widget可以停靠在QMainWindow内或作为顶层窗口浮动在桌面上 | |
主窗口 | |
MDI窗口的区域 | |
QMdiArea的子窗口类 | |
菜单, 用于菜单栏, 内容菜单和其他弹出菜单 | |
横向菜单 | |
调整顶层窗口大小的句柄 | |
水平状态栏, 显示状态信息 | |
工具栏, 包含一组操作的容器 |
主窗口类
Qt 提供以下类, 用于管理主窗口和关联的UI部分:
- QMainWindow 是应用程序创建的核心类. QMainWindow, QDockWidget 和 QToolBar 组成应用程序的顶级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(); ...
QToolBar 和 QMenu 利用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);
上述示例, 工具栏初始位置在主窗口的顶部, 但是也能移动到主窗口的底部. 我们可以看到 newAct
和 openAct
同时出现在工具栏和菜单上.
QDockWidget 和 QToolBar类似. 下列示例中, 我们创建一个停靠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 的任意派生类.