警告

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

应用程序主窗口

创建应用程序窗口。

主窗口类概述

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

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 类提供了一个可移动的面板,其中包含一组控件。

主窗口类

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

  • QMainWindow 是构建应用程序的核心类。与配套的 QDockWidgetQToolBar 类一起,它代表了应用程序的顶级用户界面。

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

  • 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的任何子类。