Python 如何保存和恢复对于小部件的每个实例都是唯一的小部件属性?

Python 如何保存和恢复对于小部件的每个实例都是唯一的小部件属性?,python,qt,pyqt,pyqt5,qsettings,Python,Qt,Pyqt,Pyqt5,Qsettings,我希望能够在我的PyQt5应用程序中保存和恢复小部件状态(属性和值)。小部件状态应保存到.ini文件中。这已在以下答案中得到证明: 然而,以上问题的答案并没有解决我在下面的示例代码中面临的具体问题。我希望settings.ini文件中的保存和还原对于正在运行的父窗口小部件(主窗口应用程序)的每个实例都是唯一的。因此,在保存小部件属性时,对所有小部件的迭代应该只发生在父小部件(主窗口)的子部件上,而不是通过当前在全局应用程序中运行的所有小部件 我认为下面示例代码中的问题与qtwidts.q

我希望能够在我的PyQt5应用程序中保存和恢复小部件状态(属性和值)。小部件状态应保存到.ini文件中。这已在以下答案中得到证明:

然而,以上问题的答案并没有解决我在下面的示例代码中面临的具体问题。我希望settings.ini文件中的保存和还原对于正在运行的父窗口小部件(主窗口应用程序)的每个实例都是唯一的。因此,在保存小部件属性时,对所有小部件的迭代应该只发生在父小部件(主窗口)的子部件上,而不是通过当前在全局应用程序中运行的所有小部件

我认为下面示例代码中的问题与qtwidts.qApp.allWidgets()中w的
行有关:
。我认为这一行迭代了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