主窗口部件 QMainWindow
主窗口提供了一个用于构建应用程序用户界面的框架。Qt 提供了以 QMainWindow 和其他一些相关的类共同完成主窗口的管理。QMainWindow 有自己的布局如下图所示,包含菜单栏、工具栏、中心部件、停靠窗口以及状态栏,使开发者可以轻松创建复杂的桌面应用程序,如文本编辑器、绘图工具、IDE等。
- 菜单栏(QMenuBar)
包含了一个下拉菜单项的列表,这些菜单项由 QAction 动作类实现。一个主窗口只能有一个菜单栏,位于主窗口顶部。
- 工具栏(QToolBar)
一般用于显示一些常用的菜单项目,也可以插入其他窗口部件,并且是可以移动的。一个主窗口可以拥有多个工具栏。
- 中心部件(Central Widget)
在主窗口的中心区域可以放入一个窗口部件作为中心部件,是应用程序的主要功能实现区域。一个主窗口只能拥有一个中心部件。
- 停靠窗口(QDockWidget)
Dock 部件常被称为停靠窗口,因为可以停靠在中心部件的四周,用来放置一些部件来实现一些功能,就像个工具箱一样。一个主窗口可以拥有多个 Dock 部件。
- 状态栏(QStatusBar)
用于显示程序的一些状态信息,在主窗口的最底部。一个主窗口只能拥有一个状态栏。
主窗口应用
我认为 Visual Studio 的主界面是一个能够很好地展示 QMainWindow 的实际应用。大家可以直观的理解各种组件如何组成一个完整的应用程序界面。
接下来我们使用 QMainWindow 模仿一下这个界面。
- 创建 QMainWindow 工程
文件 -> New Project -> Qt Widgetd Application
注意:项目路径中不要包含中文
运行起来如图所示:
- 添加菜单栏
因为一个 QMainWindow 主窗口最多只有一个菜单栏,所以可以直接使用 menuBar() 获取。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 获取 menuBar 指针
QMenuBar *menuBar = this->menuBar();
}
或者 New 一个 QMenuBar 对象。
QMenuBar *menuBar = new QMenuBar();
setMenuBar(menuBar);
- 添加菜单以及菜单项
// 创建菜单
QMenu *menuFile = new QMenu("文件(F)", this);
QMenu *menuEdit = new QMenu("编辑(E)", this);
QMenu *menuView = new QMenu("视图(V)", this);
// 菜单栏添加菜单
menuBar->addMenu(menuFile);
menuBar->addMenu(menuEdit);
menuBar->addMenu(menuView);
// 添加菜单项
QAction *actNew = new QAction("新建(N)", this);
QAction *actOpen = new QAction("打开(O)", this);
menuFile->addAction(actNew);
menuFile->addAction(actOpen);
- 添加工具栏
// 添加工具栏
QToolBar *toolBar = new QToolBar("工具栏");
addToolBar(Qt::TopToolBarArea, toolBar);
QAction *actBackUp = new QAction("后退", this);
QAction *actForward = new QAction("前进", this);
toolBar->addAction(actBackUp);
toolBar->addAction(actForward);
注意:QAction 对象是可以复用的,即可以直接使用菜单中的动作对象。
- 添加中心部件
// 添加中心部件
QLabel *label = new QLabel(this);
label->setAlignment(Qt::AlignCenter);
label->setText("这里是中心部件");
this->setCentralWidget(label);
- 添加停靠窗口
// 添加停靠窗口
QDockWidget *dockWidget = new QDockWidget("停靠窗口", this);
addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
- 添加状态栏
// 状态栏
QStatusBar *statusBar = this->statusBar();
statusBar->showMessage("这里是状态栏");
至此,我们这基本上就完成了,虽然看上去有些简陋,但是大体是有的。更多细节可以自己研究一下,例如:给工具栏中的 Action 添加图标~