Python 即使小部件关闭,如何在PyQt中保存QLineEdits中的文本?
您好,我已经使用PyQt为我的脚本制作了一个GUI,我有两个行编辑和两个按钮 (…)=(self.(…).text())我将脚本中的文本用作变量(但我认为这对问题并不重要),我希望能够将文本键入QLineEdits并保存,以便下次打开时文本仍在那里 我使用PyQt5,然后使用Py安装程序将其制作成一个应用程序,因此我希望能够将文本保存在QLineEdits中,然后在它关闭时将其保存在那里,以便下次打开它> 另外,我正在与其他人共享此应用程序,因此我希望它能够保存该用户输入的内容(他们输入的内容是他们自定义的,例如(名称或类似内容) 以下是我的pyqt5代码示例:Python 即使小部件关闭,如何在PyQt中保存QLineEdits中的文本?,python,pyqt,pyqt4,pyqt5,qsettings,Python,Pyqt,Pyqt4,Pyqt5,Qsettings,您好,我已经使用PyQt为我的脚本制作了一个GUI,我有两个行编辑和两个按钮 (…)=(self.(…).text())我将脚本中的文本用作变量(但我认为这对问题并不重要),我希望能够将文本键入QLineEdits并保存,以便下次打开时文本仍在那里 我使用PyQt5,然后使用Py安装程序将其制作成一个应用程序,因此我希望能够将文本保存在QLineEdits中,然后在它关闭时将其保存在那里,以便下次打开它> 另外,我正在与其他人共享此应用程序,因此我希望它能够保存该用户输入的内容(他们输入的内容是
对于较旧的应用程序,它实现了保存小部件状态并将其还原的功能 为了使其正常工作,应用程序必须满足以下要求:
- 您必须设置
、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的情况下,不再需要放置
对象名称
s,因为它们已经建立,但另一方面,提供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_())
您希望如何持久化数据?在数据库中,还是在磁盘(在文件中)?如果是前者,你打算使用哪个数据库服务器?如果是后者,你打算如何格式化保存的数据——二进制、纯文本、XML、JSON等?我不确定你的要求是什么,但我有一个带有文本框的gui,我只想打开我的应用程序,并将保存的文本保存在QLineEdits中,以便我使用ID我不想使用selenium chrome驱动程序脚本将其存储在任何页面文件或类似文件中@NB1987Beucase im,其中文本框包含脚本为您填写的签出信息,因此我希望它保留在他们输入的每个用户地址中@nb1987@MaxymWojnowskyj评论不用于扩展讨论;此对话爱雍一直在工作,非常感谢你,兄弟@eyllanesc@eyllanesc还有一个问题,您上次输入的信息存储在哪里?您是否接收到它或者它是如何工作的?在
还原(self.settings)
后执行打印(self.settings.fileName())
:self.settings=QtCore.QSettings()restore(self.settings)print(self.settings.fileName())
@eyllansc嘿,谢谢你的帮助,很抱歉再次打扰你,它在mac上运行得非常好,但是当我与一个使用windows的朋友共享我的脚本时,它不再保存了。你认为你可以研究一下吗?