一个典型的QMainWindow窗口布局如图:
停靠窗口可以在Central Widget之外的区域停靠,如果没有Central Widget ,那么就可以在整个区域内停靠。 主窗口提供管理和操控QDockWidget函数如下:
QDockWidget常用方法如下:
setWidget():在Dock窗口区域设置QWidget
setFloating(逻辑值):设置Dock窗口是否可以浮动,如果设置为True,则表示可以浮动
isFloating():获得停靠窗口的可浮动属性
setAllowedAreas(枚举):设置窗口可以停靠的区域:
LeftDockWidgetArea,左边停靠区域
RightDockWidgetArea,右边停靠区域
TopDockWidgetArea,顶部停靠区域
BottomDockWidgetArea,底部停靠区域
NoDockWidgetArea,不显示Widget
allowedAreas():获得停靠窗口允许停靠的区域
setFeatures(枚举):设置停靠窗口的功能属性:
DockWidgetClosable,可关闭
DockWidgetMovable,可移动
DockWidgetFloatable,可漂浮
DockWidgetVerticalTitleBar,在左边显示垂直的标签栏
AllDockWidgetFeatures,具有前三种属性的所有功能
NoDockWidgetFeatures,无法关闭,不能移动,不能漂浮
features():获得停靠窗口的特性设置
setTitleBarWidget():设置停靠窗口标题栏部件
titleBarWidget():获得停靠窗口标题栏部件
QDockWidget常用信号:
featuresChanged: 停靠窗口的特性发生了改变时发送。
topLevelChanged: 停靠窗口的浮动属性发生了改变时发送。
allowedAreasChanged: 停靠窗口的允许停靠区域发生了改变时发射该信号。
visibilityChanged: 停靠窗口的可视属性(显示/隐藏)发生改变时发送。
dockLocationChanged: 停靠窗口的位置发生了改变时发送。
【例5.5】QDockWidget 停靠测试。 如下:
import sys
# 导入Python的系统模块,用于操作Python运行时环境。
from PyQt6.QtCore import Qt
# 从PyQt6的QtCore模块导入Qt类,Qt类包含了许多常量和枚举,用于处理各种Qt框架的通用设置和参数。
from PyQt6.QtGui import QPalette, QFont
# 从PyQt6的QtGui模块导入QPalette和QFont类。这两个类分别用于处理调色板和字体设置,但在这段代码中并未实际使用它们。
from PyQt6.QtWidgets import (QApplication, QMainWindow, QDockWidget, QLabel)
# 从PyQt6的QtWidgets模块导入QApplication, QMainWindow, QDockWidget和QLabel类。
# QApplication类用于管理应用程序级别的资源和设置。
# QMainWindow类用于创建主窗口。
# QDockWidget类用于创建可以停靠在主窗口边缘的浮动窗口。
# QLabel类用于显示文本或图片,但在这段代码中并未实际使用它。
class mainWidget(QMainWindow):
# 定义一个名为mainWidget的类,该类继承自QMainWindow类。
def __init__(self, parent=None):
# 定义mainWidget类的初始化方法,parent参数默认为None,表示这个窗口没有父窗口。
super(mainWidget, self).__init__(parent)
# 调用父类QMainWindow的初始化方法,传入parent参数。
self.setWindowTitle('QDockWidget测试')
# 设置窗口的标题为“QDockWidget测试”。
self.resize(480, 360)
# 设置窗口的初始大小为宽480像素,高360像素。
self.listColors = [Qt.GlobalColor.red, Qt.GlobalColor.lightGray,
Qt.GlobalColor.green, Qt.GlobalColor.blue,
Qt.GlobalColor.cyan, Qt.GlobalColor.magenta]
# 定义一个颜色列表,用于后续可能的颜色设置,但在这段代码中并未实际使用它。
self.initUi()
# 调用initUi方法,用于初始化窗口的UI。
def initUi(self):
# 定义initUi方法,用于初始化窗口的UI。
self.takeCentralWidget() # 移除当前的CentralWidget
# 移除主窗口的中央部件(CentralWidget),因为我们要使用QDockWidget作为主要内容。
self.setDockOptions(self.dockOptions() | QMainWindow.DockOption.AllowTabbedDocks)
# 设置主窗口的停靠选项,允许将多个停靠窗口组合成标签页形式。
self.setDockNestingEnabled(True)
# 启用停靠窗口的嵌套功能,允许停靠窗口内嵌其他停靠窗口。
docks = []
# 定义一个空列表,用于存储创建的停靠窗口对象。
for index in range(6):
# 遍历0到5的整数,用于创建6个停靠窗口。
docks.append(self.crateDock(index))
# 调用crateDock方法(注意:这里可能是一个拼写错误,应该是createDock)创建停靠窗口,并将其添加到docks列表中。
self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, docks[0])
# 将docks列表中的第一个停靠窗口添加到主窗口的左侧停靠区域。
self.splitDockWidget(docks[0], docks[1], Qt.Orientation.Horizontal)
# 将docks列表中的第一个和第二个停靠窗口水平分割,使它们并排显示。
self.splitDockWidget(docks[1], docks[2], Qt.Orientation.Horizontal)
# 将docks列表中的第二个和第三个停靠窗口水平分割,使它们并排显示。
self.splitDockWidget(docks[0], docks[3], Qt.Orientation.Vertical)
# 将docks列表中的第一个和第四个停靠窗口垂直分割,使它们上下排列。
self.splitDockWidget(docks[1], docks[4], Qt.Orientation.Vertical)
# 将docks列表中的第二个和第五个停靠窗口垂直分割,使它们上下排列。
self.splitDockWidget(docks[2], docks[5], Qt.Orientation.Vertical)
# 将docks列表中的第三个和第六个停靠窗口垂直分割,使它们上下排列。
def crateDock(self, index):
# 定义一个名为crateDock的方法,接收一个参数index,用于创建并返回一个停靠窗口。
# 注意:方法名可能是个拼写错误,通常应该是createDock。
lb = QLabel(self)
# 创建一个QLabel对象lb,并将其父对象设置为当前mainWidget实例。
lb.setFont(QFont(self.font().family(), 24))
# 设置标签lb的字体,字体族与当前mainWidget的字体相同,字号为24。
lb.setText(str(index + 1))
# 设置标签lb的文本为index+1的字符串表示形式。
lb.setAlignment(Qt.AlignmentFlag.AlignCenter)
# 设置标签lb的文本对齐方式为居中。
lb.setAutoFillBackground(True)
# 启用标签lb的自动填充背景功能。
palette = QPalette()
# 创建一个QPalette对象palette,用于设置颜色。
palette.setColor(QPalette.ColorRole.Window, self.listColors[index])
# 设置palette的窗口背景颜色为listColors列表中对应index的颜色。
lb.setPalette(palette)
# 将palette设置为标签lb的调色板,即设置标签的背景颜色。
lb.resize(160, 90)
# 设置标签lb的大小为宽160像素,高90像素。
dock = QDockWidget('dock ' + str(index + 1), self)
# 创建一个QDockWidget对象dock,设置其标题为"dock "加上index+1的字符串表示,并将其父对象设置为当前mainWidget实例。
dock.setWidget(lb)
# 将之前创建的标签lb设置为dock的内部部件。
lb.show()
# 显示标签lb。
return dock
# 返回创建的停靠窗口dock。
if __name__ == '__main__':
# 检查当前模块是否为直接运行的对象,如果是,则执行以下代码。
app = QApplication(sys.argv)
# 创建一个QApplication对象app,传入命令行参数sys.argv。
m = mainWidget()
# 创建一个mainWidget对象m。
m.show()
# 显示mainWidget窗口m。
sys.exit(app.exec())
# 进入Qt的主事件循环,等待用户交互,并在退出时返回应用程序的执行状态。
功能描述:
这段代码实现了一个可以动态创建停靠窗口(QDockWidget
)的功能。每个停靠窗口包含一个标签(QLabel
),标签显示的内容是传入的index
参数加1后的值,并且标签的背景色由listColors
列表中对应索引的颜色决定。这些停靠窗口可以在一个主窗口(mainWidget
)中动态创建和显示。
使用的布局和控件:
-
布局:没有直接使用布局管理器(如
QHBoxLayout
,QVBoxLayout
等),停靠窗口(QDockWidget
)和标签(QLabel
)的位置和大小是直接设置的。 -
控件:
QLabel
:用于显示文本和设置背景色。QDockWidget
:停靠窗口,可以停靠在主窗口的边界或浮动在屏幕上。QFont
:用于设置字体。QPalette
:用于设置颜色。
关键语句:
- 创建并配置标签:
lb = QLabel(self)
:创建一个标签对象。lb.setFont(...)
:设置标签的字体。lb.setText(...)
:设置标签显示的文本。lb.setAlignment(...)
:设置文本的对齐方式。lb.setAutoFillBackground(True)
:启用自动填充背景。lb.setPalette(...)
:设置标签的背景色。lb.resize(160, 90)
:设置标签的大小。lb.show()
:显示标签。
- 创建停靠窗口并添加标签:
dock = QDockWidget('dock ' + str(index + 1), self)
:创建停靠窗口,并设置标题。dock.setWidget(lb)
:将标签设置为停靠窗口的部件。
- 应用程序初始化与事件循环:
app = QApplication(sys.argv)
:创建应用程序对象。m = mainWidget()
:创建主窗口对象。m.show()
:显示主窗口。sys.exit(app.exec())
:启动事件循环,并等待用户交互。
其他注意事项:
self.listColors[index]
似乎是在mainWidget
类中定义的一个颜色列表,用于设置标签的背景色。不过,这段代码中没有给出mainWidget
类的定义和listColors
的初始化。mainWidget
类在代码中被实例化,但没有提供其定义。我们可以假设mainWidget
是一个继承自QWidget
或类似类的自定义类。createDock
方法应该属于mainWidget
类,因为它使用了self
来引用当前实例的属性和方法。if __name__ == '__main__'
部分确保只有直接运行这个脚本时才会创建应用程序实例和主窗口,这是Python模块的标准做法,以避免在导入模块时执行不必要的代码。