gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:59:24 25 4
gpt4 key购买 nike

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

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

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

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

这是我的 pyqt5 代码示例:

enter image description here

最佳答案

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

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

  • 您必须设置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 的类不是一个小部件,而是一个负责填充小部件的类,因此我们必须创建小部件才能覆盖 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_())

关于python - 即使小部件关闭,如何在 PyQt 中的 QLineEdits 中保存文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49837565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com