Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
185 views
in Technique[技术] by (71.8m points)

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

Hello I have made a GUI for my script using PyQt I have a couple of Line edit ands a couple of buttons

(.....) = (self.(.....).text()) which I use that text for my script as a variable (but I don't think thats important to the question) I want to be able to type text into the QLineEdits and for it to save so next time I open it the text will still be there

I use PyQt5 then I use Py-installer to make it into an app So I want to be able to save the text inside the QLineEdits and then when It closes for it be be saved there for next time I open it>

Ps. I am sharing this app with other people So I want it to save what that user puts in (they are putting in stuff that is custom to them like for example (name or something like that)

Here is a sample of my pyqt5 code:

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

For an older application, it implements the functions that saved the states of the widgets and restored them.

In order for it to work properly, the application must meet the following requirements:

  • You have to set OrganizationName, OrganizationDomain and ApplicationName.

  • Each widget that you want to save the state must have an objectName

  • You must use restore() when you want to restore the states, a good option is after creating all the widgets.

  • You must use save() when you want to save the states, a good place would be closeEvent().

In the next part I show an example:

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_())

Update:

In the case that you use Qt Designer it is no longer necessary to place the objectsNames because they are already established, but on the other hand the class that provides Qt Designer is not a widget, but a class that is responsible for filling a widget, so we must create the widget to be able to overwrite the closeEvent method as shown below:

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_())

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...