Почему не работает qsettings?
Я написал код и хочу чтобы он сохранял изменения, но этого не происходит и я не знаю почему.
Помогите, объясните что не так плииз!!!
Вот код:
import contextlib
from PyQt5 import QtCore, QtGui, QtWidgets
from food import Ui_MainWindow
class SettingsManager:
def __init__(self, filename):
self.m_settings = QtCore.QSettings(filename, QtCore.QSettings.IniFormat)
@property
def settings(self):
return self.m_settings
def read(self, widget):
self.settings.beginGroup(widget.objectName())
if isinstance(widget, QtWidgets.QAbstractItemView):
selectionMode = self.settings.value(
"selectionMode", type=QtWidgets.QAbstractItemView.SelectionMode
)
widget.setSelectionMode(selectionMode)
if isinstance(widget, QtWidgets.QTableWidget):
rowCount = self.settings.value("rowCount", type=int)
columnCount = self.settings.value("columnCount", type=int)
widget.setRowCount(rowCount)
widget.setColumnCount(columnCount)
items = self.settings.value("items")
if items is None:
self.read_defaults(widget)
else:
stream = QtCore.QDataStream(items, QtCore.QIODevice.ReadOnly)
while not stream.atEnd():
it = QtWidgets.QTableWidgetItem()
i = stream.readInt()
j = stream.readInt()
stream >> it
widget.setItem(i, j, it)
selecteditems = self.settings.value("selecteditems")
stream = QtCore.QDataStream(
selecteditems, QtCore.QIODevice.ReadOnly
)
while not stream.atEnd():
i = stream.readInt()
j = stream.readInt()
it = widget.item(i, j)
if it is not None:
it.setSelected(True)
self.settings.endGroup()
def write(self, widget):
self.settings.beginGroup(widget.objectName())
if isinstance(widget, QtWidgets.QAbstractItemView):
self.settings.setValue("selectionMode", widget.selectionMode())
if isinstance(widget, QtWidgets.QTableWidget):
self.settings.setValue("rowCount", widget.rowCount())
self.settings.setValue("columnCount", widget.columnCount())
items = QtCore.QByteArray()
stream = QtCore.QDataStream(items, QtCore.QIODevice.WriteOnly)
for i in range(widget.rowCount()):
for j in range(widget.columnCount()):
it = widget.item(i, j)
if it is not None:
stream.writeInt(i)
stream.writeInt(j)
stream << it
self.settings.setValue("items", items)
selecteditems = QtCore.QByteArray()
stream = QtCore.QDataStream(
selecteditems, QtCore.QIODevice.WriteOnly
)
for it in widget.selectedItems():
# print(it.row(), it.column())
stream.writeInt(it.row())
stream.writeInt(it.column())
self.settings.setValue("selecteditems", selecteditems)
self.settings.endGroup()
def release(self):
self.m_settings.sync()
def read_defaults(self, widget):
if widget.objectName() == "tableWidget":
widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
widget.setRowCount(1)
widget.setColumnCount(4)
for i in range(widget.rowCount()):
for j in range(widget.columnCount()):
it = QtWidgets.QTableWidgetItem("{}-{}".format(i, j))
widget.setItem(i, j, it)
@contextlib.contextmanager
def settingsContext(filename):
manager = SettingsManager(filename)
try:
yield manager
finally:
manager.release()
class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, rows):
super(MyWindow, self).__init__()
self.rows = rows
self.setupUi(self)
self.pushButton.clicked.connect(self.set_row_count)
self.tableWidget.cellChanged.connect(self.cell_changed)
self.tableWidget_2.cellChanged.connect(self.cell_changed_2)
@QtCore.pyqtSlot()
def set_row_count(self):
# self.rows += 1
# self.tableWidget.setRowCount(self.rows)
rowPosition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowPosition)
def cell_changed(self, row, column):
_sum = 0
if column == 2:
if self.tableWidget.item(row, column) != None:
try:
_sum += int(self.tableWidget.item(row, column).text())
except:
pass
_bud = 0
if self.tableWidget.item(row, 1) != None:
try:
_bud = int(self.tableWidget.item(row, 1).text())
except:
pass
ost = _bud - _sum
self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(ost)))
def cell_changed_2(self, row, column):
_sum = 0
if 0 < column < 6:
for column in range(1, 5):
if self.tableWidget_2.item(row, column) != None:
try:
_sum += int(self.tableWidget_2.item(row, column).text())
except:
pass
_lgota = 0
if self.tableWidget_2.item(row, 5) != None :
try:
_lgota = int(self.tableWidget_2.item(row, 5).text())
except:
pass
ost = _sum - _lgota
self.tableWidget_2.setItem(row, 6, QtWidgets.QTableWidgetItem(str(ost)))
self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(ost)))
def closeEvent(self, event):
self.write_settings()
super().closeEvent(event)
def read_settings(self):
with settingsContext("data_T_W.ini") as m:
for children in self.findChildren(QtWidgets.QWidget):
if children.objectName():
m.read(children)
def write_settings(self):
with settingsContext("data_T_W.ini") as m:
for children in self.findChildren(QtWidgets.QWidget):
if children.objectName():
m.write(children)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyWindow()
w.resize(751, 551)
w.show()
sys.exit(app.exec_())
food:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'food.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(746, 608)
MainWindow.setStyleSheet("QLabel {\n"
" font-size:14px;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
" background-color:silver;\n"
"}\n"
"\n"
"QWidget {\n"
" background-color:white;\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(10, 30, 731, 531))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.dateEdit = QtWidgets.QDateEdit(self.tab)
self.dateEdit.setGeometry(QtCore.QRect(860, 20, 110, 22))
self.dateEdit.setObjectName("dateEdit")
self.pushButton = QtWidgets.QPushButton(self.tab)
self.pushButton.setGeometry(QtCore.QRect(0, 0, 111, 41))
self.pushButton.setStyleSheet("QPushButton{\n"
" background-color:gray;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
" background-color:silver;\n"
"}\n"
"\n"
"QPushButton:pressed{\n"
" background-color:white;\n"
"}")
self.pushButton.setObjectName("pushButton")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setGeometry(QtCore.QRect(10, 50, 431, 431))
self.tableWidget.setStyleSheet("")
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(4)
self.tableWidget.setRowCount(1)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setText("Имя ученика")
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_2)
self.tableWidget_2.setGeometry(QtCore.QRect(0, 10, 721, 521))
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(7)
self.tableWidget_2.setRowCount(1)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setText("Имя ученика")
self.tableWidget_2.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(6, item)
self.tabWidget.addTab(self.tab_2, "")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 746, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Добавить ученика"))
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Бюджет"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Потрачено"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", " Остаток"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Бюджет"))
item = self.tableWidget_2.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget_2.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Хлеб"))
item = self.tableWidget_2.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Булочка"))
item = self.tableWidget_2.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Горячее"))
item = self.tableWidget_2.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Напиток"))
item = self.tableWidget_2.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Льгота"))
item = self.tableWidget_2.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Сумма"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Питание"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Вы, по всей видимости, хотите сохранить две таблицы.
смотрите обновления в методе
read_defaultsсмотрите обновления в методе
__init__классаMyWindow. Обратите внимание, что вы забыли добавить строкуself.read_settings()
import contextlib
from PyQt5 import QtCore, QtGui, QtWidgets
from food import Ui_MainWindow
class SettingsManager:
def __init__(self, filename):
self.m_settings = QtCore.QSettings(filename, QtCore.QSettings.IniFormat)
@property
def settings(self):
return self.m_settings
def read(self, widget):
self.settings.beginGroup(widget.objectName())
if isinstance(widget, QtWidgets.QAbstractItemView):
selectionMode = self.settings.value(
"selectionMode", type=QtWidgets.QAbstractItemView.SelectionMode
)
widget.setSelectionMode(selectionMode)
if isinstance(widget, QtWidgets.QTableWidget):
rowCount = self.settings.value("rowCount", type=int)
columnCount = self.settings.value("columnCount", type=int)
widget.setRowCount(rowCount)
widget.setColumnCount(columnCount)
items = self.settings.value("items")
if items is None:
self.read_defaults(widget)
else:
stream = QtCore.QDataStream(items, QtCore.QIODevice.ReadOnly)
while not stream.atEnd():
it = QtWidgets.QTableWidgetItem()
i = stream.readInt()
j = stream.readInt()
stream >> it
widget.setItem(i, j, it)
selecteditems = self.settings.value("selecteditems")
stream = QtCore.QDataStream(
selecteditems, QtCore.QIODevice.ReadOnly
)
while not stream.atEnd():
i = stream.readInt()
j = stream.readInt()
it = widget.item(i, j)
if it is not None:
it.setSelected(True)
self.settings.endGroup()
def write(self, widget):
self.settings.beginGroup(widget.objectName())
if isinstance(widget, QtWidgets.QAbstractItemView):
self.settings.setValue("selectionMode", widget.selectionMode())
if isinstance(widget, QtWidgets.QTableWidget):
self.settings.setValue("rowCount", widget.rowCount())
self.settings.setValue("columnCount", widget.columnCount())
items = QtCore.QByteArray()
stream = QtCore.QDataStream(items, QtCore.QIODevice.WriteOnly)
for i in range(widget.rowCount()):
for j in range(widget.columnCount()):
it = widget.item(i, j)
if it is not None:
stream.writeInt(i)
stream.writeInt(j)
stream << it
self.settings.setValue("items", items)
selecteditems = QtCore.QByteArray()
stream = QtCore.QDataStream(
selecteditems, QtCore.QIODevice.WriteOnly
)
for it in widget.selectedItems():
# print(it.row(), it.column())
stream.writeInt(it.row())
stream.writeInt(it.column())
self.settings.setValue("selecteditems", selecteditems)
self.settings.endGroup()
def release(self):
self.m_settings.sync()
def read_defaults(self, widget):
if widget.objectName() == "tableWidget":
widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
widget.setRowCount(1)
widget.setColumnCount(4) # - (5) + (4)
for i in range(widget.rowCount()):
for j in range(widget.columnCount()):
it = QtWidgets.QTableWidgetItem("{}-{}".format(i, j))
widget.setItem(i, j, it)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
elif widget.objectName() == "tableWidget_2": # +++
widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
widget.setRowCount(1)
widget.setColumnCount(7)
for i in range(widget.rowCount()):
for j in range(widget.columnCount()):
it = QtWidgets.QTableWidgetItem("{}-{}".format(i, j))
widget.setItem(i, j, it)
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@contextlib.contextmanager
def settingsContext(filename):
manager = SettingsManager(filename)
try:
yield manager
finally:
manager.release()
class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self): # , rows=3 ???
super(MyWindow, self).__init__()
# ??? self.rows = rows # ???
self.setupUi(self)
self.pushButton.clicked.connect(self.set_row_count)
self.tableWidget.cellChanged.connect(self.cell_changed)
self.tableWidget_2.cellChanged.connect(self.cell_changed_2)
self.read_settings() # +++
@QtCore.pyqtSlot()
def set_row_count(self):
# self.rows += 1
# self.tableWidget.setRowCount(self.rows)
rowPosition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowPosition)
def cell_changed(self, row, column):
_sum = 0
if column == 2:
if self.tableWidget.item(row, column) != None:
try:
_sum += int(self.tableWidget.item(row, column).text())
except:
pass
_bud = 0
if self.tableWidget.item(row, 1) != None:
try:
_bud = int(self.tableWidget.item(row, 1).text())
except:
pass
ost = _bud - _sum
self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(ost)))
def cell_changed_2(self, row, column):
_sum = 0
if 0 < column < 6:
for column in range(1, 5):
if self.tableWidget_2.item(row, column) != None:
try:
_sum += int(self.tableWidget_2.item(row, column).text())
except:
pass
_lgota = 0
if self.tableWidget_2.item(row, 5) != None :
try:
_lgota = int(self.tableWidget_2.item(row, 5).text())
except:
pass
ost = _sum - _lgota
self.tableWidget_2.setItem(row, 6, QtWidgets.QTableWidgetItem(str(ost)))
self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(ost)))
def closeEvent(self, event):
self.write_settings()
super().closeEvent(event)
def read_settings(self):
with settingsContext("data_T_W.ini") as m:
for children in self.findChildren(QtWidgets.QWidget):
if children.objectName():
m.read(children)
def write_settings(self):
with settingsContext("data_T_W.ini") as m:
for children in self.findChildren(QtWidgets.QWidget):
if children.objectName():
m.write(children)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyWindow()
w.resize(751, 551)
w.show()
sys.exit(app.exec_())
