【问题标题】:PyQt5 move QDockWidget by dragging tabPyQt5通过拖动标签移动QDockWidget
【发布时间】:2020-12-17 16:39:10
【问题描述】:

下面的剪辑显示通过拖动选项卡(而不是标题栏)在停靠区域之间拖动 QDockWidgets - 但是当我使用 PyQt 5.15.0 尝试此操作时,它不起作用,选项卡不会分离。如何启用此行为?

我想要什么:
https://www.screencast.com/t/lv83SoyVUhbd(来自https://woboq.com/blog/qdockwidget-changes-in-56.html

我得到了什么:
https://www.screencast.com/t/bIUj4vLNTF

我的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    main = QtWidgets.QMainWindow()

    dock1 = QtWidgets.QDockWidget("Blue")
    dock2 = QtWidgets.QDockWidget("Green")
    dock3 = QtWidgets.QDockWidget("Red")

    content1 = QtWidgets.QWidget()
    content1.setStyleSheet("background-color:blue;")

    content2 = QtWidgets.QWidget()
    content2.setStyleSheet("background-color:green;")

    content3 = QtWidgets.QWidget()
    content3.setStyleSheet("background-color:red;")

    dock1.setWidget(content1)
    dock2.setWidget(content2)
    dock3.setWidget(content3)

    dock1.setAllowedAreas(Qt.AllDockWidgetAreas)
    dock2.setAllowedAreas(Qt.AllDockWidgetAreas)
    dock3.setAllowedAreas(Qt.AllDockWidgetAreas)

    main.addDockWidget(Qt.LeftDockWidgetArea, dock1)
    main.tabifyDockWidget(dock1, dock2)
    main.addDockWidget(Qt.RightDockWidgetArea, dock3)

    main.resize(400, 200)
    main.show()

    app.exec_()

【问题讨论】:

    标签: python pyqt pyqt5 qt5


    【解决方案1】:

    我的问题的解决方案是在QMainWindow 上启用GroupedDraggingsetDockOptions。通过下面的代码,我设法获得了与我想要的完全一样的漂亮外观和行为。

    演示:https://www.screencast.com/t/GU5Z2ysT

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtCore import Qt
    
    
    class DockWidget(QtWidgets.QDockWidget):
        def __init__(self, title: str):
            super().__init__(title)
            self.setTitleBarWidget(QtWidgets.QWidget())
            self.dockLocationChanged.connect(self.on_dockLocationChanged)
    
        def on_dockLocationChanged(self):
            main: QtWidgets.QMainWindow = self.parent()
            all_dock_widgets = main.findChildren(QtWidgets.QDockWidget)
    
            for dock_widget in all_dock_widgets:
                sibling_tabs = main.tabifiedDockWidgets(dock_widget)
                # If you pull a tab out of a group the other tabs still see it as a sibling while dragging...
                sibling_tabs = [s for s in sibling_tabs if not s.isFloating()]
    
                if len(sibling_tabs) != 0:
                    # Hide title bar
                    dock_widget.setTitleBarWidget(QtWidgets.QWidget())
                else:
                    # Re-enable title bar
                    dock_widget.setTitleBarWidget(None)
    
        def minimumSizeHint(self) -> QtCore.QSize:
            return QtCore.QSize(100, 100)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        main = QtWidgets.QMainWindow()
    
        dock1 = DockWidget("Blue")
        dock2 = DockWidget("Green")
        dock3 = DockWidget("Red")
    
        content1 = QtWidgets.QWidget()
        content1.setStyleSheet("background-color:blue;")
        content1.setMinimumSize(QtCore.QSize(50, 50))
    
        content2 = QtWidgets.QWidget()
        content2.setStyleSheet("background-color:green;")
        content2.setMinimumSize(QtCore.QSize(50, 50))
    
        content3 = QtWidgets.QWidget()
        content3.setStyleSheet("background-color:red;")
        content3.setMinimumSize(QtCore.QSize(50, 50))
    
        dock1.setWidget(content1)
        dock2.setWidget(content2)
        dock3.setWidget(content3)
    
        dock1.setAllowedAreas(Qt.AllDockWidgetAreas)
        dock2.setAllowedAreas(Qt.AllDockWidgetAreas)
        dock3.setAllowedAreas(Qt.AllDockWidgetAreas)
    
        main.addDockWidget(Qt.LeftDockWidgetArea, dock1)
        main.tabifyDockWidget(dock1, dock2)
        main.addDockWidget(Qt.RightDockWidgetArea, dock3)
    
        main.setDockOptions(main.GroupedDragging | main.AllowTabbedDocks | main.AllowNestedDocks)
    
        main.setTabPosition(Qt.AllDockWidgetAreas, QtWidgets.QTabWidget.North)
        main.resize(400, 200)
        main.show()
    
        app.exec_()
    
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 2013-01-30
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多