应用程序主窗口
主窗口类概述
这些类提供了构建典型现代应用程序主窗口所需的一切,例如主窗口本身、菜单和工具栏,以及状态栏。
可停靠在 QMainWindow 内,或作为顶级窗口在桌面上浮动的控件 | |
应用程序主窗口 | |
用于显示 MDI 窗口的区域 | |
QMdiArea 的子窗口类 | |
用于菜单栏、上下文菜单和其他弹出菜单的菜单控件 | |
水平菜单栏 | |
用于调整顶级窗口大小的调整大小控点 | |
适用于显示状态信息的水平条 | |
包含一组控件的可移动面板 | |
通过接口扩展 QAction,以便将自定义控件插入到基于操作的容器(如工具栏)中 |
主窗口类
Qt 提供了以下类来管理主窗口及相关用户界面组件:
- QMainWindow 是应用程序构建的核心类。它与配套的QDockWidget 和QToolBar 类共同构成了应用程序的顶级用户界面。
- QDockWidget 提供了一种小部件,可用于创建可分离的工具面板或辅助窗口。停靠小部件会跟踪自身的属性,并且可以被移动、关闭,或作为外部窗口浮动显示。
- QToolBar 提供了一个通用的工具栏控件,可容纳多种与操作相关的控件,例如按钮、下拉菜单、组合框和旋转框。Qt 强调统一的操作模型,这意味着工具栏能与菜单和键盘快捷键良好配合。
示例代码
使用QMainWindow 非常简单。通常,您需要继承QMainWindow 类,并在QMainWindow 构造函数中设置菜单、工具栏和停靠控件。
要向主窗口添加菜单栏,请创建菜单并将其添加到主窗口的菜单栏中。请注意,首次调用QMainWindow::menuBar()函数时,系统会自动创建菜单栏。您也可以调用QMainWindow::setMenuBar()来在主窗口中使用自定义菜单栏。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
...
newAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentNew),
tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, &QAction::triggered, this, &MainWindow::newFile);
openAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen),
tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(tr("Open an existing file"));
connect(openAct, &QAction::triggered, this, &MainWindow::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);在此示例中,停靠控件只能放置在左侧和右侧停靠区域,且初始位置为左侧停靠区域。
QMainWindow API 允许您自定义哪些停靠控件区域占据停靠控件区域的四个角。如有需要,可通过QMainWindow::setCorner() 函数更改默认设置:
setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);下图展示了上述代码生成的布局。请注意,在此布局中,左右两个停靠控件将分别占据主窗口的顶部和底部角落。
在设置完所有主窗口组件后,可通过类似以下代码创建并安装中央控件:
中央控件可以是QWidget 的任何子类。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.