Как сохранить текст в 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_())