即使小部件关闭,如何在 PyQt 的 QLineEdits 中保存文本?

How to save text in QLineEdits in PyQt even if the Widget gets closed?

你好,我使用 PyQt 为我的脚本制作了一个 GUI 我有几个行编辑器和几个按钮

(.....) = (self.(.....).text()) 我将脚本的文本用作变量(但我认为这对问题)我希望能够在 QLineEdits 中输入文本并保存它,这样下次我打开它时,文本仍会存在

我使用 PyQt5 然后我使用 Py-installer 将它变成一个应用程序所以我希望能够将文本保存在 QLineEdits 中然后当它关闭时将它保存在那里以备下次打开它>

Ps。我正在与其他人分享这个应用程序所以我希望它保存用户输入的内容(他们输入的是他们自定义的东西,例如(名称或类似的东西)

这是我的 pyqt5 代码示例:

对于较旧的应用程序,它实现了保存和恢复小部件状态的功能。

为了使其正常工作,应用程序必须满足以下要求:

  • 您必须设置 OrganizationNameOrganizationDomainApplicationName

  • 每个要保存状态的小部件必须有一个 objectName

  • 当你想恢复状态时必须使用restore(),一个好的选择是在创建所有小部件之后。

  • 保存状态必须用save()closeEvent().

在下一部分中,我将展示一个示例:

import sys

from PyQt5 import QtWidgets, QtCore

# for PyQt4 change QtWidget to QtGui and PyQt5 to PyQt4


def restore(settings):
    finfo = QtCore.QFileInfo(settings.fileName())
    if finfo.exists() and finfo.isFile():
        for w in QtWidgets.qApp.allWidgets():
            mo = w.metaObject()
            if w.objectName() and not w.objectName().startswith("qt_"):
                settings.beginGroup(w.objectName())
                for i in range( mo.propertyCount(), mo.propertyOffset()-1, -1):
                    prop = mo.property(i)
                    if prop.isWritable():
                        name = prop.name()
                        val = settings.value(name, w.property(name))
                        if str(val).isdigit():
                            val = int(val)
                        w.setProperty(name, val)
                settings.endGroup()

def save(settings):
    for w in QtWidgets.qApp.allWidgets():
        mo = w.metaObject()
        if w.objectName() and not w.objectName().startswith("qt_"):
            settings.beginGroup(w.objectName())
            for i in range(mo.propertyCount()):
                prop = mo.property(i)
                name = prop.name()
                if prop.isWritable():
                    settings.setValue(name, w.property(name))
            settings.endGroup()


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName("widget")
        self.init_ui()
        self.settings = QtCore.QSettings()
        print(self.settings.fileName())
        restore(self.settings)

    def init_ui(self):
        lay = QtWidgets.QVBoxLayout(self)
        lineEdit1 = QtWidgets.QLabel("label")
        lineEdit1.setObjectName("label")
        lineEdit2 = QtWidgets.QLineEdit()
        lineEdit2.setObjectName("lineEdit2")
        combobox = QtWidgets.QComboBox()
        combobox.addItems(["1", "2", "3"])
        combobox.setObjectName("combo")
        lay.addWidget(lineEdit1)
        lay.addWidget(lineEdit2)
        lay.addWidget(combobox)

    def closeEvent(self, event):
        save(self.settings)
        super().closeEvent(event)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    QtCore.QCoreApplication.setOrganizationName("Eyllanesc")
    QtCore.QCoreApplication.setOrganizationDomain("eyllanesc.com")
    QtCore.QCoreApplication.setApplicationName("MyApp")
    ex = Widget()
    ex.show()
    sys.exit(app.exec_())

更新:

在使用 Qt Designer 的情况下,不再需要放置 objectsName,因为它们已经建立,但另一方面,提供 Qt Designer 的 class 不是一个小部件,但是一个 class 负责填充一个小部件,因此我们必须创建小部件才能覆盖 closeEvent 方法,如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ...
    def retranslateUi(self, MainWindow):
        ...

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setupUi(self)
        self.settings = QtCore.QSettings()
        restore(self.settings)

    def closeEvent(self, event):
        save(self.settings)
        super().closeEvent(event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    QtCore.QCoreApplication.setOrganizationName("Eyllanesc")
    QtCore.QCoreApplication.setOrganizationDomain("eyllanesc.com")
    QtCore.QCoreApplication.setApplicationName("MyApp")
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())