Python PyQt5通过拖动选项卡移动QDockWidget

Python PyQt5通过拖动选项卡移动QDockWidget,python,pyqt,pyqt5,qt5,Python,Pyqt,Pyqt5,Qt5,下面的剪辑显示了通过拖动选项卡(而不是标题栏)在停靠区域之间拖动QDockWidgets,但是当我尝试使用PyQt 5.15.0时,它不起作用,选项卡不会分离。如何启用此行为 我想要的: (来自) 我得到的: 我的代码: from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt if __name__ == "__main__": app = QtWidgets.QApplicat

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

我想要的:
(来自)

我得到的:

我的代码:

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_()

我的问题的解决方案是在
qmain窗口上启用
groupedtragging
setDockOptions
。我成功地获得了一个非常好的外观和行为,就像我使用下面的代码所希望的那样

演示:

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_()