PyQt6第五章容器布局之5.2窗口布局(5.2.2停靠:QDockWidget)

一个典型的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)中动态创建和显示。

使用的布局和控件

  1. 布局:没有直接使用布局管理器(如QHBoxLayoutQVBoxLayout等),停靠窗口(QDockWidget)和标签(QLabel)的位置和大小是直接设置的。

  2. 控件

    • QLabel:用于显示文本和设置背景色。
    • QDockWidget:停靠窗口,可以停靠在主窗口的边界或浮动在屏幕上。
    • QFont:用于设置字体。
    • QPalette:用于设置颜色。

关键语句

  1. 创建并配置标签
    • lb = QLabel(self):创建一个标签对象。
    • lb.setFont(...):设置标签的字体。
    • lb.setText(...):设置标签显示的文本。
    • lb.setAlignment(...):设置文本的对齐方式。
    • lb.setAutoFillBackground(True):启用自动填充背景。
    • lb.setPalette(...):设置标签的背景色。
    • lb.resize(160, 90):设置标签的大小。
    • lb.show():显示标签。
  2. 创建停靠窗口并添加标签
    • dock = QDockWidget('dock ' + str(index + 1), self):创建停靠窗口,并设置标题。
    • dock.setWidget(lb):将标签设置为停靠窗口的部件。
  3. 应用程序初始化与事件循环
    • 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模块的标准做法,以避免在导入模块时执行不必要的代码。

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值