news 2026/7/4 3:04:19

PySide6 的 QSettings简单应用学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PySide6 的 QSettings简单应用学习笔记

QSettings 是 PySide6 中用于持久化存储设定的类,会自动将应用的配置数据保存到系统对应位置(Windows 注册表、macOS/iOS 的 plist 文件、Linux 的配置文件),无需手动管理文件路径。QSettings 的核心价值是“跨平台 + 简化持久化存储”,核心特点可概括为 3 点:

  1. 用途:专门存储应用的配置数据(如窗口大小、用户偏好、登录状态等),程序重启后能恢复这些设定,避免重复配置;
  2. 跨平台自动适配:无需写平台判断代码,它会根据系统自动选择存储位置(Windows 写注册表、macOS/iOS 存 plist、Linux 存标准配置目录文件),开发者不用关心 “文件放哪”;
  3. 使用便捷:以 “键值对(key-value)” 方式读写数据,支持字符串、数字、布尔值等常见类型,无需手动处理文件创建、读写、解析(比如不用自己写 json/xml 读写逻辑)。

  • 以QMainWindow为例介绍QSettings的简单用法:

QMainWindow 提供了以下方法来实现:

方法

作用

saveGeometry()

保存窗口的几何状态(位置、大小、是否最大化 / 最小化),返回 QByteArray 类型

saveState()

保存窗口的布局状态(工具栏位置、停靠窗口位置 / 状态、菜单栏可见性等),返回 QByteArray 类型

restoreGeometry(QByteArray)

恢复窗口几何状态

restoreState(QByteArray)

恢复窗口布局状态

import sys from PySide6.QtWidgets import ( QApplication, QMainWindow, QTextEdit, QDockWidget, QLabel, QWidget, QVBoxLayout ) from PySide6.QtCore import ( QSettings, QByteArray, Qt, QCoreApplication ) # 全局配置:统一组织名/应用名(必须和保存时一致) ORG_NAME = "MyCompany" APP_NAME = "DockRestoreApp" class MainWindow(QMainWindow): def __init__(self): super().__init__() # 1. 先初始化所有UI部件(包括停靠窗口、工具栏) self.init_base_ui() self.init_dock_widgets() # 2. 后恢复窗口状态(关键顺序) self.restore_window_state() def init_base_ui(self): """初始化基础UI(中央部件、窗口属性)""" self.setWindowTitle("停靠窗口状态恢复示例") # 中央部件(必须设置) central_widget = QTextEdit() central_widget.setPlaceholderText("中央编辑区") self.setCentralWidget(central_widget) def init_dock_widgets(self): """初始化停靠窗口(必须设置唯一ObjectName)""" # 左侧停靠窗口(核心:设置唯一ObjectName,Qt靠这个识别停靠窗口) left_dock = QDockWidget("左侧面板", self) left_dock.setObjectName("LeftDockWidget") # 必须! # 停靠窗口内容 dock_content = QWidget() dock_layout = QVBoxLayout(dock_content) dock_layout.addWidget(QLabel("左侧停靠窗口内容")) dock_layout.addStretch() left_dock.setWidget(dock_content) # 设置停靠规则 left_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) left_dock.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetClosable) # 添加到主窗口 self.addDockWidget(Qt.LeftDockWidgetArea, left_dock) # 可选:添加第二个停靠窗口测试 right_dock = QDockWidget("右侧面板", self) right_dock.setObjectName("RightDockWidget") # 必须! right_dock.setWidget(QLabel("右侧停靠窗口内容")) self.addDockWidget(Qt.RightDockWidgetArea, right_dock) def restore_window_state(self): """恢复窗口状态(几何+布局)""" # 初始化QSettings(强制INI格式,方便调试,可选) QSettings.setDefaultFormat(QSettings.IniFormat) settings = QSettings(ORG_NAME, APP_NAME) # 1. 恢复窗口几何状态(位置、大小) geometry = settings.value("geometry", QByteArray()) if isinstance(geometry, str): geometry = QByteArray.fromBase64(geometry.encode()) if not geometry.isEmpty(): # 恢复失败则用默认大小 if not self.restoreGeometry(geometry): self.resize(1000, 700) # 2. 恢复窗口布局状态(核心:停靠窗口/工具栏) window_state = settings.value("windowState", QByteArray()) if isinstance(window_state, str): window_state = QByteArray.fromBase64(window_state.encode()) if not window_state.isEmpty(): # 关键:指定版本号(默认0,若布局变更可升级版本) self.restoreState(window_state, version=0) def closeEvent(self, event): """窗口关闭时保存状态""" settings = QSettings(ORG_NAME, APP_NAME) # 保存几何状态 settings.setValue("geometry", self.saveGeometry()) # 保存布局状态(包含停靠窗口) settings.setValue("windowState", self.saveState(version=0)) # 立即同步到磁盘(避免延迟) settings.sync() # 允许关闭 event.accept() if __name__ == "__main__": # 全局设置组织名/应用名(QSettings依赖) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_NAME) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())


  • 关键细节与注意事项

1. QSettings的存储路径

默认情况下,QSettings 会根据系统自动选择存储位置:

  • Windows:HKEY_CURRENT_USER\Software\MyCompany\MyApp(注册表)
  • macOS:~/Library/Preferences/com.MyCompany.MyApp.plist
  • Linux:~/.config/MyCompany/MyApp.conf

如果想强制保存为INI 文件(便于调试),可在初始化 QApplication 后设置:

QSettings.setDefaultFormat(QSettings.IniFormat) # 自定义INI文件路径 settings = QSettings("my_app_config.ini", QSettings.IniFormat)

2.数据类型兼容问题

  • saveGeometry()/saveState() 返回 QByteArray,但 QSettings 存储时可能自动转为字符串(Base64 编码);
  • 读取时需判断类型,若为字符串则转回 QByteArray(如示例中所示),否则 restoreGeometry 会失效。

3.版本兼容(重要)

如果后续修改了窗口布局(如新增 / 删除停靠窗口、工具栏),restoreState 可能会失败。解决方法:

# 保存时指定版本号 self.saveState(1) # 版本号1 # 恢复时指定版本号(兼容旧版本) self.restoreState(window_state, 1)

4.避免恢复异常

  • 若保存的状态损坏(如手动修改配置文件),restoreGeometry/restoreState 会返回 False,可增加判断:
if not self.restoreGeometry(geometry): self.resize(800, 600) # 恢复失败则使用默认大小

5.清除保存的状态

如需重置窗口状态,可删除 QSettings 中的对应键:

settings = QSettings("MyCompany", "MyApp") settings.remove("geometry") settings.remove("windowState") settings.sync() # 立即同步到磁盘

  • 扩展用法

1.保存更多自定义状态

除了窗口状态,还可保存用户偏好(如字体、主题、上次打开的文件路径):

# 保存 settings.setValue("last_open_file", "/home/user/test.txt") settings.setValue("font_size", 14) settings.setValue("dark_mode", True) # 读取 last_file = settings.value("last_open_file", "") font_size = int(settings.value("font_size", 12)) dark_mode = settings.value("dark_mode", False, type=bool)

2.全局共享 QSettings

在大型应用中,可创建全局 QSettings 实例,避免重复初始化:

# 全局配置 class AppSettings: _instance = None @classmethod def get_instance(cls): if cls._instance is None: cls._instance = QSettings("MyCompany", "MyApp") return cls._instance # 使用 settings = AppSettings.get_instance() settings.setValue("geometry", self.saveGeometry())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 4:36:39

C++ 结构体(struct)【1】

C/C 数组允许定义可存储相同类型数据项的变量,但是结构是 C 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性&#x…

作者头像 李华
网站建设 2026/7/4 9:10:22

gpt-oss-20b在低资源环境下的性能调优技巧

gpt-oss-20b在低资源环境下的性能调优技巧 在大模型如GPT-4等闭源系统主导云端AI服务的当下,一个现实问题日益凸显:普通开发者、中小企业甚至科研团队难以负担高昂的算力成本和数据隐私风险。尽管这些顶级模型能力强大,但它们往往依赖A100级别…

作者头像 李华
网站建设 2026/7/3 8:00:15

记力扣557.反转字符串中的单词 练习理解

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:输入:s "Lets take LeetCode contest" 输出:"steL ekat edoCteeL tsetnoc"示例 2:输入&#…

作者头像 李华
网站建设 2026/6/30 21:58:57

将Seed-Coder-8B-Base嵌入VS Code插件的完整开发流程

将Seed-Coder-8B-Base嵌入VS Code插件的完整开发流程 在现代软件开发中,一个常见的矛盾逐渐浮现:我们手握强大的大语言模型,却不得不将代码片段上传到云端才能获得智能补全建议。这对金融、军工或任何重视源码安全的企业来说几乎是不可接受的…

作者头像 李华
网站建设 2026/6/30 21:58:45

提升文生图效率:利用VSCode插件集成FLUX.1-dev开发环境

提升文生图效率:利用VSCode插件集成FLUX.1-dev开发环境 在数字内容创作的前沿战场上,设计师与开发者正面临一个共同挑战:如何让创意从“想到”到“看见”的路径更短、更直观、更可控?传统的文本生成图像工作流往往割裂——写提示词…

作者头像 李华
网站建设 2026/7/4 9:49:42

利用Easy File Sharing Web Server漏洞进行攻击

一、环境准备1、目标机:主机(下载并安装Easy File Sharing Web Server(以下用efs表示))2、攻击机:kali二、信息收集1、下载好的efs打开,用户名和密码不用输入,直接运行2、进入之后可以看到主机开放的端口&a…

作者头像 李华