python - 仅当标题栏未在 QDockWidget 中浮动时如何删除它
问题描述
我想在它不浮动时隐藏dockwidget中的标题栏。
dock = QDockWidget()
dock.setTitleBarWidget(QWidget())
dock.titleBarWidget().hide()
这是隐藏dockwidget的标题栏但是当它浮动时,它不显示标题栏
解决方案
您知道,当您隐藏停靠的 QDockWidget 的标题栏时,它不再是可移动的了,对吧?
事情没那么简单。我最终将一些事件拼接在一起:
我有排列(编辑)模式和查看(正常)模式。在编辑模式下,标题栏是可见的,以允许根据需要拖放面板。工具栏按钮负责切换模式。在您的情况下,您只能采用查看模式(关闭排列模式)。
当面板未停靠且表单未设置为编辑模式时,未停靠面板的标题栏将重置为
None
,从而显示窗口边框,而停靠的面板隐藏了标题栏。当未停靠的面板停靠时,如果表单处于查看模式,则标题栏设置为小部件本身,从而将其隐藏。
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_()
推荐阅读
- anaconda - 无法在 Win10 中使用 miniconda 安装 GCC
- java - 面对 java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverter.toOracleStringWithReplacement 异常
- jenkins - PATH 中没有这样的可执行文件 D:\Git\bin\git.exe: /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /root/bin
- r - 如何从 .pdf 文件中正确提取所有表并将其写入 R 中的 .csv 文件?
- webpack - 网页包 | AssetModuleFilename 中的 [query] 是什么意思:'images/[hash][ext][query]'?
- javascript - 具有承诺返回和传递值的函数如何按顺序正确执行?
- javascript - 在 AngularJS 中设置动态 aria-label
- r - 基于一列验证两个数据框
- java - Apache Ignite 无法从 IP finder 连接到任何地址
- mysql - MySQL查询根据日期查找最长的值序列