首页 > 解决方案 > 仅当标题栏未在 QDockWidget 中浮动时如何删除它

问题描述

我想在它不浮动时隐藏dockwidget中的标题栏。

dock = QDockWidget()
dock.setTitleBarWidget(QWidget())
dock.titleBarWidget().hide()

这是隐藏dockwidget的标题栏但是当它浮动时,它不显示标题栏

标签: pythonpyqt5show-hidefloatingqdockwidget

解决方案


您知道,当您隐藏停靠的 QDockWidget 的标题栏时,它不再是可移动的了,对吧?

事情没那么简单。我最终将一些事件拼接在一起:

  1. 我有排列(编辑)模式和查看(正常)模式。在编辑模式下,标题栏是可见的,以允许根据需要拖放面板。工具栏按钮负责切换模式。在您的情况下,您只能采用查看模式(关闭排列模式)。

  2. 当面板未停靠且表单未设置为编辑模式时,未停靠面板的标题栏将重置为None,从而显示窗口边框,而停靠的面板隐藏了标题栏。

  3. 当未停靠的面板停靠时,如果表单处于查看模式,则标题栏设置为小部件本身,从而将其隐藏。topLevelChanged信号用于触发检查和更改。

结果是窗口可以以多种方式排列,停靠或取消停靠,并具有干净的用户体验。请注意,虽然在示例中您可以将选项卡设置为可关闭,但在示例中未处理关闭按钮。

这是功能齐全的测试应用程序:

from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QMainWindow, QTextEdit, QDockWidget, QToolBar, QTabWidget, QAction, QLayout, QTabBar
import PyQt5.QtWidgets
from PyQt5.QtGui import QIcon, QPixmap
#from PyQt5.QtCore import QMainWindow

_DOCK_OPTS = PyQt5.QtWidgets.QMainWindow.AllowNestedDocks
_DOCK_OPTS |= PyQt5.QtWidgets.QMainWindow.AllowTabbedDocks

class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("Test")
        tb = self.addToolBar("Test") 
        self.ShowTitleBars = False
        secondQMainWindow = QMainWindow()
        
        
        self.setTabPosition (Qt.LeftDockWidgetArea, QTabWidget.North)
        self.central = secondQMainWindow
        self.setDockOptions(_DOCK_OPTS)
        self.dw1 = QDockWidget("One")
        self.dw1.topLevelChanged.connect(self.HideTitleBar)
        self.dw1.setTitleBarWidget(QWidget(self.dw1))
        textArea = QTextEdit()
        textArea.setText("Text area 1")
        self.dw1.setWidget(textArea)

        self.dw2 = QDockWidget("Two")
        textArea2 = QTextEdit()
        textArea2.setText("Text area 2")
        self.dw2.setWidget(textArea2)
        self.dw2.topLevelChanged.connect(self.HideTitleBar)
        self.dw2.setTitleBarWidget(QWidget(self.dw2))
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dw1)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dw2)
        self.tabifyDockWidget(self.dw1, self.dw2)
        self.dw3 = QDockWidget("Three")
        self.dw3.topLevelChanged.connect(self.HideTitleBar)
        self.dw3.setTitleBarWidget(QWidget(self.dw3))
        textArea3 = QTextEdit()
        textArea3.setText("Text area 3")
        self.dw3.setWidget(textArea3)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dw3)
                
        barOn = QAction("Tabs closable",self)
        barOn.triggered.connect(self.CountTabWidgetsInTopWindow)    
        tb.addAction(barOn)    
                        
        barOff = QAction("Anotherbar",self)
        #barOff.triggered.connect(self.ToogleTwo)
        tb.addAction(barOff)
                                
        barTog = QAction("Toggle Title Bars",self)
        barTog.setCheckable(True)
        barTog.triggered.connect(self.ToogleTitles2)
        tb.addAction(barTog)
        
                
    def ToogleTwo(self):       
        self.dw1.setTitleBarWidget(QWidget(self.dw1))
        self.dw2.setTitleBarWidget(QWidget(self.dw2))
        self.dw3.setTitleBarWidget(QWidget(self.dw3))
        print("Test OFF")

    def ToogleTitles(self):
        #self.dw1.setTitleBarWidget(self.dw1)
        self.dw1.setTitleBarWidget(None)
        self.dw2.setTitleBarWidget(None)
        self.dw3.setTitleBarWidget(None)
        print("Test ON")
        
    def SetTabsClosable(self):
        for widget in self.children():
            if isinstance(widget, QTabBar):
                widget.setTabsClosable(True)        
        
    def CountTabWidgetsInTopWindow(self):
        for widget in self.children():
            if isinstance(widget, QTabBar):
                widget.setTabsClosable(True)
            else:
                print("QTabWidget " + widget.objectName() + "  --  " + widget.__class__.__name__)
        print("Counted.")

    def HideTitleBar(self):
        dockw = self.sender()
        if dockw.isFloating() == False and self.ShowTitleBars == False:
            dockw.setTitleBarWidget(QWidget(dockw))

    def ToogleTitles2(self):        
        if self.ShowTitleBars == True:
            self.ShowTitleBars = False
        else:
            self.ShowTitleBars = True
        for widget in self.children():
            if isinstance(widget, QDockWidget):
                if widget.titleBarWidget() == None and self.ShowTitleBars == False:
                    if widget.isFloating() == False:
                        widget.setTitleBarWidget(QWidget(widget))                        
                else:
                    widget.setTitleBarWidget(None)              
        print("Test Toggle")


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec_()

推荐阅读