我在这个网站上找到了一个非常好的解决方案,以便在pyqt5中存储gui设置:Python PyQt4 functions to save and restore UI widget values?
解决方案保存在 guisave 功能中。
现在我试图将此功能实现到我的代码中。 我的想法是用 exitAction 按钮关闭我的gui。这会触发 closeApp 函数,该函数会触发 guisave 函数。 guisave 函数现在应该保存我所有的pyqt对象 问题是这不会发生。我不确定如何在 guisave 函数中指定 ui 变量。 如您所见,我尝试分配主窗口类。但这不起作用。我还不确定这是否有效,或者我是否需要单独扫描所有功能,因为 QEditLine 在tab2UI函数中。
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import inspect
class mainwindow(QMainWindow):
def __init__(self, parent = None):
super(mainwindow, self).__init__(parent)
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('icon\\exit.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
exitAction.triggered.connect(self.closeApp)
self.toolbar = self.addToolBar('Exit')
self.toolbar.setMovable(False)
self.toolbar.addAction(exitAction)
self.tab_widget = QTabWidget(self) # add tab
self.tab2 = QWidget()
self.tab_widget.addTab(self.tab2, "Tab_2")
self.tab2UI()
self.setCentralWidget(self.tab_widget)
def tab2UI(self):
self.layout = QFormLayout()
self.layout.addRow("Name",QLineEdit())
self.layout.addRow("Address",QLineEdit())
self.tab2.setLayout(self.layout)
def closeApp(self):
guisave()
def guisave():
ui = mainwindow
settings = QSettings('gui.ini', QSettings.IniFormat)
for name, obj in inspect.getmembers(ui):
if isinstance(obj, QComboBox):
name = obj.objectName() # get combobox name
index = obj.currentIndex() # get current index from combobox
text = obj.itemText(index) # get the text for current index
settings.setValue(name, text) # save combobox selection to registry
if isinstance(obj, QLineEdit):
print obj.objectName()
name = obj.objectName()
value = obj.text()
settings.setValue(name, value) # save ui values, so they can be restored next time
print name, value
if isinstance(obj, QCheckBox):
name = obj.objectName()
state = obj.isChecked()
settings.setValue(name, state)
if isinstance(obj, QRadioButton):
name = obj.objectName()
value = obj.isChecked() # get stored value from registry
settings.setValue(name, value)
def main():
app = QApplication(sys.argv)
ex = mainwindow()
ex.setGeometry(100,100,1000,600)
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
答案 0 :(得分:0)
我建议的解决方案负责保存QWidgets的状态,但为此必须在属性objectName中输入一个名称:
objectName:QString
此属性包含此对象的名称。您可以使用findChild()按名称(和类型)查找对象。您可以 使用findChildren()找到一组对象。
访问功能:
QString objectName() const
void setObjectName (const QString& name)
所以你应该输入一个名字,例如:
self.tab_widget.setObjectName("tabWidget")
我们可以使用QApplication :: allWidgets()函数来获取应用程序的所有小部件,然后我们获取属性并保存它们,恢复过程与前一个相反。
def restore(settings):
finfo = QFileInfo(settings.fileName())
if finfo.exists() and finfo.isFile():
for w in qApp.allWidgets():
mo = w.metaObject()
if w.objectName() != "":
for i in range(mo.propertyCount()):
name = mo.property(i).name()
val = settings.value("{}/{}".format(w.objectName(), name), w.property(name))
w.setProperty(name, val)
def save(settings):
for w in qApp.allWidgets():
mo = w.metaObject()
if w.objectName() != "":
for i in range(mo.propertyCount()):
name = mo.property(i).name()
settings.setValue("{}/{}".format(w.objectName(), name), w.property(name))
找到完整示例here