PyQt5 QDockWidget 状态保存

10 篇文章 3 订阅
7 篇文章 0 订阅

注意,不适用于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_())

运行之后,点击中心的“保存布局”,即可保存布局。
下次打开的时候,就会按照上次保存布局之前的状态进行打开。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以通过使用QStandardItemModel模块来向QListView添加数据,具体步骤如下: 1. 导入需要的模块 ```python from PyQt5.QtGui import QStandardItemModel, QStandardItem ``` 2. 创建QStandardItemModel模型 ```python self.model = QStandardItemModel() ``` 3. 添加QStandardItem ```python item = QStandardItem("Hello World") self.model.appendRow(item) ``` 4. 将模型设置为QListView的模型 ```python self.listView.setModel(self.model) ``` 完整的代码示例: ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView from PyQt5.QtGui import QStandardItemModel, QStandardItem import sys class App(QWidget): def __init__(self): super().__init__() self.setWindowTitle("PyQt5 ListView") self.setGeometry(100, 100, 500, 500) # 创建QListView self.listView = QListView(self) # 创建QStandardItemModel模型 self.model = QStandardItemModel() # 添加QStandardItem item = QStandardItem("Hello World") self.model.appendRow(item) # 将模型设置为QListView的模型 self.listView.setModel(self.model) # 创建布局管理器 layout = QVBoxLayout() layout.addWidget(self.listView) # 设置窗口的布局管理器 self.setLayout(layout) # 显示窗口 self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_()) ``` ### 回答2: 在PyQt5中,我们可以使用QListView控件来展示并存储数据。下面是一个简单的示例,说明如何向QListView保存数据: 首先,我们需要在PyQt5中导入需要的模块: ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView from PyQt5.QtCore import QStringListModel ``` 然后,我们创建一个窗口和布局: ```python app = QApplication([]) window = QWidget() layout = QVBoxLayout(window) ``` 接下来,我们创建一个数据列表和一个字符串列表模型,将其连接到QListView控件: ```python data = ['数据1', '数据2', '数据3', '数据4'] model = QStringListModel() model.setStringList(data) list_view = QListView() list_view.setModel(model) layout.addWidget(list_view) ``` 为了能够在列表中添加新的数据,我们可以在窗口中添加一个按钮,并连接到一个槽函数: ```python from PyQt5.QtWidgets import QPushButton, QLineEdit button = QPushButton('添加数据') line_edit = QLineEdit() def add_data(): new_data = line_edit.text() data.append(new_data) model.setStringList(data) line_edit.setText('') button.clicked.connect(add_data) layout.addWidget(line_edit) layout.addWidget(button) ``` 最后,我们显示窗口并运行应用程序: ```python window.show() app.exec_() ``` 通过运行上述代码,我们可以创建一个包含数据的QListView控件,并且可以通过按钮向列表中添加新的数据。每当添加新数据时,QListView会自动更新以展示最新的数据。 ### 回答3: PyQt5可以使用QListView保存数据,下面是一个简单的示例: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QListView, QStringListModel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.list_view = QListView(self) self.setCentralWidget(self.list_view) # 创建字符串列表模型 self.list_model = QStringListModel() # 初始化数据 data = ['Apple', 'Banana', 'Cherry'] self.list_model.setStringList(data) # 将模型设置给列表视图 self.list_view.setModel(self.list_model) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个QListView对象,并将其设置为窗口的中心部件。然后,我们创建了一个QStringListModel对象作为模型,并使用字符串列表“Apple”、“Banana” 和“Cherry”进行初始化。最后,我们将模型设置给列表视图,这样就可以在列表视图中显示数据了。 如果想要动态添加或删除数据,可以通过QStringListModel提供的方法来实现。例如,可以使用`insertRows()`方法来添加行,使用`removeRows()`方法来删除行,并使用`setData()`方法来更新数据。 希望这个简单的示例对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值