警告

本节包含从 C++ 自动翻译到 Python 的代码片段,可能存在错误。

应用程序主窗口#

创建应用程序窗口。

MainWindow 类概述#

这些类提供了一切您需要的典型现代主应用程序窗口,例如主窗口本身、菜单和工具栏以及状态栏。

PySide6.QtWidgets.QWidgetAction

QWidgetAction 类通过一个界面扩展了 QAction,可用于将自定义小部件插入基于操作的容器中,例如工具栏。

PySide6.QtWidgets.QDockWidget

QDockWidget 类提供了一种可以在 QMainWindow 内部停靠或作为桌面顶层窗口浮动的窗口小部件。

PySide6.QtWidgets.QMainWindow

QMainWindow 类提供了一个主应用程序窗口。

PySide6.QtWidgets.QMdiArea

QMdiArea 小部件提供了一个用于显示 MDI 窗口的应用区域。

PySide6.QtWidgets.QMdiSubWindow

QMdiSubWindow 类提供了 QMdiArea 的子窗口类。

PySide6.QtWidgets.QMenu

QMenu 类提供了一个用于菜单栏、上下文菜单和其他弹出菜单的菜单小部件。

PySide6.QtWidgets.QMenuBar

QMenuBar 类提供了一个水平菜单栏。

PySide6.QtWidgets.QSizeGrip

QSizeGrip 类提供了一个用于调整顶层窗口大小的大小控件。

PySide6.QtWidgets.QStatusBar

QStatusBar 类提供了一个适合展示状态信息的水平栏。

PySide6.QtWidgets.QToolBar

QToolBar 类提供了一个可移动的面板,其中包含一组控件。

MainWindow 类#

Qt 为管理主窗口和相关用户界面组件提供了以下类

  • QMainWindow 是围绕应用程序构建的中心类。与配套的 QDockWidgetQToolBar 类一起,它表示应用程序的最高级别用户界面。

  • QDockWidget 提供了一个可用于创建可分离的工具栏或辅助窗口的小部件。停靠窗口跟踪自己的属性,并且可以作为外部窗口移动、关闭和浮动。

  • QToolBar 提供了一个通用的工具栏小部件,可以包含许多不同与操作相关的控件,如按钮、下拉菜单、组合框和旋转框。Qt 对统一操作模型的强调意味着工具栏与菜单和键盘快捷键的协作良好。

示例代码#

使用 QMainWindow 非常简单。通常,您会从 QMainWindow 继承,并在 QMainWindow 构造函数内部设置菜单、工具栏和停靠小部件。

要将菜单栏添加到主窗口中,创建菜单并将它们添加到主窗口的菜单栏中。请注意,menuBar() 函数在第一次调用时将自动创建菜单栏。您还可以调用 setMenuBar() 以在主窗口中使用自定义菜单栏。

def __init__(self, parent):
    super().__init__(parent)            ...

newAct = QAction(QIcon.fromTheme(QIcon.ThemeIcon.DocumentNew),
                     tr("New"), self)
newAct.setShortcuts(QKeySequence.New)
newAct.setStatusTip(tr("Create a file()"))
newAct.triggered.connect(self.newFile)            ...

创建动作后,可以将它们添加到主窗口组件中。首先,将它们添加到弹出菜单中

fileMenu = menuBar().addMenu(tr("File"))
fileMenu.addAction(newAct)
fileMenu.addAction(openAct)            ...

fileMenu.addSeparator()            ...

QToolBarQMenu 类使用 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);
    ...

fileToolbar.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea)
addToolBar(Qt.TopToolBarArea, fileToolbar)

在这个例子中,工具栏仅限于主窗口的顶部和底部工具栏区域,最初放置在顶部工具栏区域。我们可以看到由 newActopenAct 指定的动作将同时显示在工具栏和文件菜单中。

QDockWidget 的使用方式与 QToolBar 类似。您创建一个停靠小部件作为主窗口的子窗口,并将小部件作为停靠小部件的子窗口添加

contentsWindow = QDockWidget(tr("Table of Contents"), self)
contentsWindow.setAllowedAreas(Qt.LeftDockWidgetArea
                              | Qt.RightDockWidgetArea)
addDockWidget(Qt.LeftDockWidgetArea, contentsWindow)
headingList = QListWidget(contentsWindow)
contentsWindow.setWidget(headingList)

在这个例子中,停靠小部件只能放置在左部和右部停靠区域,最初放置在左部停靠区域。

QMainWindow API 允您自定义哪些停靠小部件区域占据停靠区域四个角落。如果需要,可以使用 setCorner() 函数来更改默认设置

setCorner(Qt.TopLeftCorner, Qt.LeftDockWidgetArea)
setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)
setCorner(Qt.TopRightCorner, Qt.RightDockWidgetArea)
setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea)

以下图显示了上述代码生成的配置。请注意,在此布局中,左右边的窗格小部件将占据主窗口的上下角落。

../_images/mainwindow-docks-example.png

一旦完成所有主窗口组件的设置,就可以通过类似于以下代码的方式创建并安装中央窗格小部件:

centralWidget = QWidget(self)
setCentralWidget(centralWidget)

中央窗格小部件可以是 QWidget 的任何子类。