Python 如何保存和恢复对于小部件的每个实例都是唯一的小部件属性?
我希望能够在我的PyQt5应用程序中保存和恢复小部件状态(属性和值)。小部件状态应保存到.ini文件中。这已在以下答案中得到证明:Python 如何保存和恢复对于小部件的每个实例都是唯一的小部件属性?,python,qt,pyqt,pyqt5,qsettings,Python,Qt,Pyqt,Pyqt5,Qsettings,我希望能够在我的PyQt5应用程序中保存和恢复小部件状态(属性和值)。小部件状态应保存到.ini文件中。这已在以下答案中得到证明: 然而,以上问题的答案并没有解决我在下面的示例代码中面临的具体问题。我希望settings.ini文件中的保存和还原对于正在运行的父窗口小部件(主窗口应用程序)的每个实例都是唯一的。因此,在保存小部件属性时,对所有小部件的迭代应该只发生在父小部件(主窗口)的子部件上,而不是通过当前在全局应用程序中运行的所有小部件 我认为下面示例代码中的问题与qtwidts.q
行有关:
。我认为这一行迭代了PyQt5全局应用程序中当前打开的所有小部件。但是,当同一父窗口小部件有多个实例时,objectName中将存在重复。虽然可以在init()期间为每个实例指定唯一的名称(例如:app_name
),并在QSettings键中进行说明,但这可能不是最佳的通用解决方案。因此,我如何解决我面临的问题?如何获取settings\u save()
函数来迭代父窗口小部件(主窗口应用程序)实例的所有子窗口小部件,而不是全局应用程序中当前运行的所有父窗口小部件?在Qt文档中,我找不到类似于allWidgets()
的函数,该函数允许我指定父窗口小部件(例如:QMainWindow)并提供其下的所有窗口小部件和对象。如果可以在父窗口小部件中获取所有窗口小部件,那么我可以轻松地修改函数settings\u save()
不仅包括QSetting变量作为参数,还包括我要为其保存设置的窗口小部件的实例
main_app.py
导入系统
从PyQt5导入QtWidgets、uic、QtCore、QtGui
从PyQt5.QtCore导入QFileInfo、QSettings、QObject
从PyQt5.QtWidgets导入qApp
从ui\u主窗口导入ui\u主窗口
def设置值有效(val):
# https://stackoverflow.com/a/60028282/4988010
如果isinstance(val,QtGui.QPixmap):
返回非val.isNull()
返回真值
def设置\u恢复(设置):
# https://stackoverflow.com/a/60028282/4988010
finfo=QtCore.QFileInfo(settings.fileName())
如果finfo.exists()和finfo.isFile():
对于qtwidts.qApp.allWidgets()中的w:
如果w.objectName()而不是w.objectName().StartWith(“qt_”):
#如果w.objectName():
mo=w.metaObject()
对于范围内的i(mo.propertyCount()):
prop=mo.property(i)
name=prop.name()
last_值=w.属性(名称)
key=“{}/{}”。格式(w.objectName(),name)
#打印(道具、名称、最后值、键)
如果不是设置。包含(键):
持续
val=设置值(键,类型=类型(最后一个值),)
如果(
val!=最后一个值
和设置值为有效值(val)
和prop.isValid()
和prop.iswriteable()
):
w、 setProperty(名称,val)
def设置\u保存(设置):
# https://stackoverflow.com/a/60028282/4988010
对于qtwidts.qApp.allWidgets()中的w:
如果w.objectName()而不是w.objectName().StartWith(“qt_”):
#如果w.objectName():
mo=w.metaObject()
对于范围内的i(mo.propertyCount()):
prop=mo.property(i)
name=prop.name()
key=“{}/{}”。格式(w.objectName(),name)
val=w.property(名称)
如果设置值为有效(val)且prop.isValid()和prop.isWritable():
settings.setValue(键,w.property(名称))
类MyApp(QtWidgets.QMainWindow):
def uuu init(self,app_name='DefaultAppName'):
超级(MyApp,self)。\uuuu init\uuuuu()
self.settings=QSettings(“./temp/gui\u settings-{}.ini.”格式(app\u名称),QSettings.ini格式)
self.ui=ui\u主窗口()
self.ui.setupUi(self)
#设置窗口标题LTE和qlineedit以指示应用程序实例的名称
self.ui.app\u instance\u name.setText(app\u name)
self.setWindowTitle(应用程序名称)
#加载从以前的应用程序使用中保存的配置文件
self.config\u widgets\u load\u settings()
self.ui.action\u save\u current\u config.triggered.connect(self.config\u widgets\u save\u设置)
self.ui.action\u load\u config.triggered.connect(self.config\u widgets\u load\u设置)
self.ui.action\u clear\u config\u file.triggered.connect(self.config\u clear\u设置)
def config_widgets_save_设置(自):
#将当前状态写入设置配置文件
设置\保存(自我设置)
def config_widgets_load_设置(自身):
#加载设置配置文件
设置\u还原(自我设置)
def配置清除设置(自身):
#清除设置配置文件
self.settings.clear()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=qtwidts.QApplication(sys.argv)
#MyApp的第一个实例
app#one=MyApp(app#name='app#1')
app_one.show()
#MyApp的第二个实例
app#two=MyApp(app#name='app#2')
应用程序2.show()
app.exec()
ui\u main window.py
从PyQt5导入QtCore、QtGui、qtwidget
类Ui_主窗口(对象):
def设置UI(自我,主窗口):
MainWindow.setObjectName(“MainWindow”)
MainWindow.re