Как сохранить текст в QLineEdits в PyQt, даже если виджет закрывается?

Здравствуйте, я сделал графический интерфейс для моего скрипта, используя PyQt. У меня есть несколько строк редактирования и несколько кнопок.

(.....) = (self.(.....).text()), который я использую этот текст для моего сценария в качестве переменной (но я не думаю, что это важно для вопроса) Я хочу иметь возможность вводить текст в QLineEdits и сохранять его, поэтому в следующий раз, когда я открою его, текст все еще будет там

Я использую PyQt5, затем использую Py-installer, чтобы превратить его в приложение. Поэтому я хочу иметь возможность сохранить текст внутри QLineEdits, а затем, когда он закроется, его можно сохранить там в следующий раз, когда я его открою>

Ps. Я делюсь этим приложением с другими людьми, поэтому я хочу, чтобы оно сохранило то, что вкладывает этот пользователь (они добавляют что-то, что ему нравится, например, (имя или что-то в этом роде)

Вот пример моего кода pyqt5:

введите описание изображения здесь

1 ответ

Решение

Для более старого приложения оно реализует функции, которые сохраняли состояния виджетов и восстанавливали их.

Для правильной работы приложение должно соответствовать следующим требованиям:

  • Вы должны установить OrganizationName, OrganizationDomain а также ApplicationName,

  • Каждый виджет, который вы хотите сохранить, должен иметь 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, является не виджетом, а классом, отвечающим за заполнение виджета, поэтому мы должны создать виджет, чтобы иметь возможность перезаписывать 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_())
Другие вопросы по тегам