問題描述
您好,我已經使用 PyQt 為我的腳本制作了一個 GUI,我有幾個行編輯和幾個按鈕
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()) 我將該文本用于我的腳本作為變量(但我認為這對問題并不重要)我希望能夠在 QLineEdits 中輸入文本并保存它,所以下次我打開它時,文本仍然存在
(.....) = (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
我使用 PyQt5 然后我使用 Py-installer 將它變成一個應用程序所以我希望能夠將文本保存在 QLineEdits 中,然后當它關閉時保存在那里以備下次打開它>
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)
這是我的 pyqt5 代碼示例:
Here is a sample of my pyqt5 code:
推薦答案
對于較老的應用程序,它實現了保存和恢復小部件狀態的功能.
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:
您必須設置
OrganizationName
、OrganizationDomain
和ApplicationName
.
您要保存狀態的每個小部件都必須有一個 objectName
Each widget that you want to save the state must have an objectName
當你想恢復狀態時,你必須使用 restore()
,一個不錯的選擇是在創建所有的小部件之后.
You must use restore()
when you want to restore the states, a good option is after creating all the widgets.
當你想保存狀態時,你必須使用save()
,一個好地方是closeEvent()
.
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_())
<小時>
更新:
如果您使用 Qt Designer,則不再需要放置 objectsName
,因為它們已經建立,但另一方面,提供 Qt Designer 的類不是小部件,而是一個負責填充小部件的類,因此我們必須創建小部件才能覆蓋 closeEvent
方法,如下所示:
In the case that you use Qt Designer it is no longer necessary to place the objectsName
s 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_())
這篇關于即使小部件關閉,如何在 PyQt 中的 QLineEdits 中保存文本?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!