注意,不适用于PySide。
import os
import sys
from PyQt5.QtCore import pyqtSignal, Qt
# from PyQt5.QtGui import Q
from PyQt5.QtWidgets import QHBoxLayout, QDockWidget, QMainWindow, QListWidget, QTextEdit, QPushButton, QApplication, \
QWidget, QToolBar, QAction, QVBoxLayout, QMenu
class MyDockWidget(QDockWidget):
def dockLocationChanged(self, area: Qt.DockWidgetArea) -> None:
print(area)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# self.toolbox.setFeatures(QDockWidget.NoDockWidgetFeatures)
# self.toolbox.DockWidgetClosable
# 创建QDockWidget窗口(标题,自身窗口)
self.items = MyDockWidget('Dockable', self)
self.items.setObjectName('1')
self.items2 = QDockWidget('Dockable', self)
self.items2.setObjectName('2')
self.items3 = QDockWidget('Dockable', self)
self.items3.setObjectName('3')
self.items4 = QDockWidget('Dockable', self)
self.items4.setObjectName('4')
# 实例化列表窗口,添加几个条目
self.listWidget = QListWidget()
self.listWidget.addItem('Item1')
self.listWidget.addItem('Item2')
self.listWidget.addItem('Item3')
self.listWidget.addItem('Item4')
# 在窗口区域设置QWidget,添加列表控件
self.items.setWidget(self.listWidget)
self.items2.setWidget(QTextEdit())
self.items3.setWidget(QTextEdit())
# self.items4.setWidget(QTextEdit())
# 设置dock窗口是否可以浮动,True,运行浮动在外面,自动与主界面脱离,False,默认浮动主窗口内,可以手动脱离
self.items.setFloating(False)
self.items2.setFloating(False)
self.items3.setFloating(False)
# self.items4.setFloating(False)
# 设置QTextEdit为中央小控件
b = QPushButton('此为中央控件,点击保存布局')
b.clicked.connect(self.save_layout)
self.setCentralWidget(b)
# 将窗口放置在中央小控件的右侧
self.addDockWidget(Qt.RightDockWidgetArea, self.items)
self.addDockWidget(Qt.LeftDockWidgetArea, self.items2)
self.addDockWidget(Qt.RightDockWidgetArea, self.items3)
self.addDockWidget(Qt.LeftDockWidgetArea, self.items4)
ld = self.items2.layoutDirection()
fl = self.items.isFloating()
# print(s)
print(ld, fl)
print(self.items.features())
# print(self.items4.layoutDirection())
# print(self.items.layoutDirection(), self.items4.layoutDirection())
self.setWindowTitle('Dock 例子')
# self.add_widget_on_dock('hahahahaha',QPushButton('ttttttttttt'))
self.load_layout()
def add_widget_on_dock(self, dock_name: str, widget: QWidget):
dw = QDockWidget()
dw.setObjectName(dock_name)
dw.setWidget(widget)
self.addDockWidget(Qt.LeftDockWidgetArea, dw)
def save_layout(self):
p = '换成你指定路径/layout.ini'
with open(p, 'wb') as f:
s = self.saveState()
f.write(s)
def load_layout(self):
p = '换成你指定路径/layout.ini'
if os.path.exists(p):
with open(p, 'rb') as f:
s = f.read()
self.restoreState(s)
def on_boot_finished(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec_())
运行之后,点击中心的“保存布局”,即可保存布局。
下次打开的时候,就会按照上次保存布局之前的状态进行打开。