107.PyQt5_QDockWidget_浮动窗口控件

在这里插入图片描述

我 的 个 人 主 页: 失心疯的个人主页
入 门 教 程 推 荐 : Python零基础入门教程合集
虚 拟 环 境 搭 建 : Python项目虚拟环境(超详细讲解)
PyQt5 系 列 教 程: Python GUI(PyQt5)文章合集
Oracle数据库教程: Oracle数据库文章合集
优 质 资 源 下 载 : 资源下载合集

在这里插入图片描述

QDockWidget 浮动窗口控件

  • 描述
    • QDockWidget停靠窗口控件来实现浮动窗口的功能
    • QDockWidget停靠窗口控件一般使用在QMainWindow中,它是放置在QMainWindow中的中央窗口小部件周围的停靠窗口小部件区域中的次要窗口
    • QDockWidget可以在主窗口的四个边缘停靠,用户可以通过拖动和放置QDockWidget到主窗口的边缘来创建和定位布局
    • QDockWidget常用于显示工具栏、属性编辑器、文件浏览器等工具
    • 注意事项:
      • 1、QDockWidget只能添加一个子控件,如果需要放多个控件,可以将多个控件放在一个QWidget内,然后再将整个QWidget放在QDockWidget中
      • 2、QMainWindow需要设置中心区域控件,否则QDockWidget会占满整个屏幕,看不出效果
  • 继承自:
  • 功能作用
    • 构造函数
      QDockWidget(parent, flags)                  # 创建对象的同时设置父对象,并设置窗口标志
      QDockWidget(title, parent, flags)           # 创建对象的同时设置窗口标题和父对象,并设置窗口标志
      # 参数 flags
          # Qt.MSWindowsFixedSizeDialogHint       # 窗口无法调整大小
          # Qt.FramelessWindowHint                # 窗口无边框
          # Qt.CustomizeWindowHint                # 有边框但无标题栏和按钮,不能移动和拖动。
          # Qt.WindowTitleHint                    # 添加标题栏和一个不可用的关闭按钮
          # Qt.WindowSystemMenuHint               # 添加系统目录和一个关闭按钮
          # Qt.WindowMaximizeButtonHint           # 激活最大化和关闭按钮,禁止最小化按钮
          # Qt.WindowMinimizeButtonHint           # 激活最小化和关闭按钮,禁止最大化按钮
          # Qt.WindowMinMaxButtonsHint            # 激活最小化,最大化和关闭按钮
          # Qt.WindowCloseButtonHint              # 添加一个关闭按钮
          # Qt.WindowContextHelpButtonHint        # 添加问号和关闭按钮,同对话框
          # Qt.WindowStaysOnTopHint               # 窗口始终处于顶层位置(QQ登录界面)
          # Qt.WindowStaysOnBottomHint            # 窗口始终处于底层位置
      
    • 添加控件
      setWidget()                                 # 在Dock窗口区域设置QWidget
      
    • 窗口浮动
      setFloating()                               # 设置Dock窗口是否可以浮动
      
    • 窗口标题栏控件
      setTitleBarWidget(QWidget)                  # 设置停靠窗口标题栏控件
      
    • 停靠区域
      setAllowedAreas(Qt.DockWidgetAreas)         # 设置窗口可以停靠的区域
      # 参数 Qt.DockWidgetAreas
          # Qt.LeftDockWidgetArea        # 窗口可在左侧停靠;
          # Qt.RightDockWidgetArea       # 窗口可在右侧停靠;
          # Qt.TopDockWidgetArea         # 窗口可在顶端停靠;
          # Qt.BottomDockWidgetArea      # 窗口可在底端停靠;
          # Qt.AllDockWidgetArea         # 窗口可在任意方向停靠;
          # Qt.NoDockWidgetArea          # 只可停靠在插入处
      
    • 窗口关闭、浮动、移动属性
      setFeatures(QDockWidget.DockWidgetFeatures)     # 设置停靠窗口的功能属性
      # 参数 QDockWidget.DockWidgetFeatures
          # QDockWidget.DockWidgetClosable            # 允许关闭,在一些系统上会显示一个关闭按钮;
          # QDockWidget.DockWidgetMovable             # 允许在Dock之间移动;
          # QDockWidget.DockWidgetFloatable           # 允许作为一个独立窗口浮动;
          # QDockWidget.DockWidgetVerticalTitleBar    # 在Dock左侧显示一个垂直标题栏;
          # QDockWidget.AllDockWidgetFeatures         # 具有前三种属性的所有功能;
          # QDockWidget.NoDockWidgetFeatures          # 无具体特性设置,无法关闭、移动或者浮动
      
  • QMainWindow提供了一系列函数来管理和操控QDockWidget
    addDockWidget(Qt.DockWidgetArea, QDockWidget)                       # 添加一个给定的停靠窗口到指定区域
    addDockWidget(Qt.DockWidgetArea, QDockWidget, Qt.Orientation)       # 添加一个给定的停靠窗口到指定区域
    # 参数 Qt.DockWidgetAreas
        # Qt.LeftDockWidgetArea        # 窗口可在左侧停靠;
        # Qt.RightDockWidgetArea       # 窗口可在右侧停靠;
        # Qt.TopDockWidgetArea         # 窗口可在顶端停靠;
        # Qt.BottomDockWidgetArea      # 窗口可在底端停靠;
        # Qt.AllDockWidgetArea         # 窗口可在任意方向停靠;
        # Qt.NoDockWidgetArea          # 只可停靠在插入处
    # 参数 Qt.Orientation
        # Qt.Horizontal     # 水平方向
        # Qt.Vertical       # 垂直方向
            
    splitDockWidget(QDockWidget, QDockWidget, Qt.Orientation)           # 把两个dock进行左右或上下并排布置,做成一个类似QSplitter的功能
    # 参数 Qt.Orientation
            # Qt.Horizontal     # 水平方向
            # Qt.Vertical       # 垂直方向
    
    tabifyDockWidget(QDockWidget, QDockWidget)                           # 	移动第二个停靠窗口到第一个停靠窗口
    # 可以在主窗口中生成一个标签样式的停靠窗口
    
    tabifiedDockWidgets(QDockWidget)                                     # 返回和指定停靠窗口形成标签样式的停靠窗口列表
    
    removeDockWidget(QDockWidget)                                        # 从主窗口布局中移除停靠窗口,并隐藏它
    # 注意,停靠窗口并不会被删除
    
    restoreDockWidget(QDockWidget)                                       # 恢复停靠窗口的状态
    dockWidgetArea(QDockWidget)                                          # 返回指定停靠窗口的停靠区域,返回值为Qt. DockWidgetArea的相关取值
    
    resizeDocks(Iterable[QDockWidget], Iterable[int], Qt.Orientation)    # 改变指定停靠窗口列表的尺寸
    setDockNestingEnabled(bool)                                          # 设置停靠窗口是否可以嵌套
    isDockNestingEnabled() -> bool                                       # 返回停靠窗口是否有可嵌套的特性
    setDockOptions(QMainWindow.DockOptions)                              # 设置停靠窗口的停靠属性
    # 参数 QMainWindow.DockOptions
        # QMainWindow.AnimatedDocks         # 动画方式停靠
        # QMainWindow.AllowNestedDocks      # 允许嵌套
        # QMainWindow.AllowTabbedDocks      # 允许标签页方式停靠
        # QMainWindow.ForceTabbedDocks      # 强制标签页方式停靠
        # QMainWindow.VerticalTabs          # 垂直标签页方式
        # QMainWindow.GroupedDragging       # 允许成组拖动标签页停靠窗口
    

  • 可用信号
    allowedAreasChanged(allowedAreas)           #  停靠窗口的允许停靠区域发生了改变时,发射该信号
    dockLocationChanged(area)                   # 停靠窗口的位置发生了改变时,发射该信号
    featuresChanged(features)                   # 停靠窗口的特性发生了改变时,发射该信号
    topLevelChanged(topLevel)                   # 停靠窗口的浮动属性发生了改变时,发射该信号
    visibilityChanged(visible)                  # 停靠窗口的可视属性(显示/隐藏)发生改变时,发射该信号
    

  • 示例代码
  • 示例1:通过QWidget将多个子控件添加到QDockWidget控件中
    from PyQt5.Qt import *
    import sys
    
    
    class Windows(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QDockWidget')
            self.resize(500, 300)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
        def add_widget(self):
            # 创建QDockWidget控件
            dockw = QDockWidget('浮动框1')
            # 创建QWidget控件,用做QDockWidget子控件,承载多个其他控件
            sub_w = QWidget()
            # 将QWidget控件绑定给QDockWidget控件
            dockw.setWidget(sub_w)
            # 给QMainWindow主窗口中间区域设置控件
            self.setCentralWidget(QTextEdit())
            # 将QDockWidget控件添加到QMainWindow主窗口左侧
            self.addDockWidget(Qt.LeftDockWidgetArea, dockw)
    
            # 创建一批子控件
            btn1 = QPushButton('按钮1')
            btn2 = QPushButton('按钮2')
            btn3 = QPushButton('按钮3')
            cmb = QComboBox()
            cmb.addItems(['北京','上海','深圳','广东','香港','澳门'])
    
            # 创建一个垂直布局,用于给sub_w布局
            hlayout = QVBoxLayout()
            hlayout.addWidget(btn1)
            hlayout.addWidget(btn2)
            hlayout.addWidget(btn3)
            hlayout.addWidget(cmb)
            # 将布局绑定给sub_w控件
            sub_w.setLayout(hlayout)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())
    
    
  • 示例2:通过QDockWidget控件信号,完善上面布局
    • 本案例意在通过QDockWidget改变停靠区域触发dockLocationChanged信号,对QDockWidget中的QWidget控件重新布局
    • 但是并没有达到效果,还未找到原因
    from PyQt5.Qt import *
    import sys
    
    
    class Windows(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QDockWidget')
            self.resize(500, 300)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
        def add_widget(self):
            # 创建QDockWidget控件
            self.dockw = QDockWidget('浮动框1')
            # 创建QWidget控件,用做QDockWidget子控件,承载多个其他控件
            self.sub_w = QWidget()
            # 将QWidget控件绑定给QDockWidget控件
    
            # 给QMainWindow主窗口中间区域设置控件
            self.setCentralWidget(QTextEdit())
            # 将QDockWidget控件添加到QMainWindow主窗口左侧
            self.addDockWidget(Qt.LeftDockWidgetArea, self.dockw)
    
            # 创建一批子控件
            btn1 = QPushButton('按钮1')
            btn2 = QPushButton('按钮2')
            btn3 = QPushButton('按钮3')
            cmb = QComboBox()
            cmb.addItems(['北京','上海','深圳','广东','香港','澳门'])
    
            self.sub_ls = [btn1, btn2, btn3, cmb]
            self.create_layout(1)
    
            self.dockw.dockLocationChanged.connect(self.locationchang)
    
        def locationchang(self, area):
            self.create_layout(area)
    
        def create_layout(self, area):
            # 创建一个垂直布局,用于给sub_w布局
            if area == 1 or area == 2:
                layout = QVBoxLayout()
            elif area == 0 or area == 4 or area == 8:
                layout = QHBoxLayout()
            self.sub_win_layout(layout)
    
        def sub_win_layout(self, layout):
            for sub_wd in self.sub_ls:
                # print(sub_w)
                layout.addWidget(sub_wd)
            # 将布局绑定给sub_w控件
            self.sub_w.setLayout(layout)
            self.dockw.setWidget(self.sub_w)
            print('重新布局结束')
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())
    
    
    

你可能感兴趣的:(PyQt5,开发语言,pyqt5,python,GUI,python,pyqt)