Сохранение данных QTableView при закрытии приложения с использованием QSettings
Изъезженный вопрос но тем не менее до сих пор не могу понять как сохранить данные после закрытия. Использую QtCore.QSettings(). Написал часть кода для сохранения, не работает.
- сюда же отдельный вопрос как расширить колоны в таблице в коде?
Counter.py
import sys
from random import randint
from PyQt5 import QtWidgets, QtCore, QtGui
class CustomTableView(QtWidgets.QTableView):
def __init__(self, parent=None):
super(CustomTableView, self).__init__(parent)
self.setSortingEnabled(True)
def KeyPressEvent(self, event: QtGui.QKeyEvent):
if event.key() == QtCore.Qt.Key_Enter:
print("Key_Enter ")
elif event.key() == QtCore.Qt.Key_Return:
print("Key_Return ")
class NumberSortModel(QtCore.QSortFilterProxyModel):
def lessThan(self, left_index: "QModelIndex",
right_index: "QModelIndex") -> bool:
left_var: str = left_index.data(QtCore.Qt.EditRole)
right_var: str = right_index.data(QtCore.Qt.EditRole)
try:
return float(left_var) < float(right_var)
except (ValueError, TypeError):
pass
try:
return left_var < right_var
except TypeError:
return True
class Counter(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Counter, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Window)
QtWidgets.QMainWindow.__init__(self)
font = QtGui.QFont("Formula1", 10, QtGui.QFont.Bold)
self.setFont(font)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
grid_layout = QtWidgets.QGridLayout()
central_widget.setLayout(grid_layout)
self.model = QtGui.QStandardItemModel(self)
self.model.setHorizontalHeaderLabels(["Name" , "Points"])
self.proxy = NumberSortModel()
self.proxy.setSourceModel(self.model)
self.table = CustomTableView(self)
self.table.setModel(self.proxy)
update_button = QtWidgets.QPushButton("Update")
update_button.clicked.connect(self.on_update_button)
update_action = QtWidgets.QAction()
sort_button = QtWidgets.QPushButton("Sort")
self.qlineedit_name = QtWidgets.QLineEdit()
self.qlineedit_name.resize(24, 80)
self.qlineedit_name.selectAll()
self.qlineedit_points = QtWidgets.QLineEdit()
self.qlineedit_points.resize(24, 80)
self.qlineedit_points.selectAll()
horisontal_layout = QtWidgets.QHBoxLayout()
horisontal_layout.addWidget(self.qlineedit_name, stretch=1)
horisontal_layout.addWidget(self.qlineedit_points, stretch=1)
horisontal_layout.addStretch(1)
horisontal_layout.addWidget(update_button)
horisontal_layout.addWidget(sort_button)
horisontal_layout.setAlignment(QtCore.Qt.AlignRight)
grid_layout.addLayout(horisontal_layout, 0, 0)
grid_layout.addWidget(self.table, 1, 0)
#---------------------------------------------------------------------
# settings = QtCore.QSettings('table.list', QtCore.QSettings.IniFormat)
# settings.setValue(self.table)
# settings.sync()
#---------------------------------------------------------------------
def on_update_button(self, event):
name = self.qlineedit_name.text().strip()
point = self.qlineedit_points.text().strip() if self.qlineedit_points.text().strip() else '0'
if not point.isdigit():
msg = QtWidgets.QMessageBox.information(self, 'ВНИМАНИЕ', 'Заполните правильно поле ввода Points!')
return
if not name:
msg = QtWidgets.QMessageBox.information(self, 'ВНИМАНИЕ', 'Заполните поле ввода Name!')
return
rows = self.table.model().rowCount()
add_record = True
for row in range(rows):
if name == self.proxy.data(self.proxy.index(row, 0)):
add_record = False
row_edit = row
break
if add_record:
if self.table.selectedIndexes():
row = self.table.selectedIndexes()[-1].row()
self.model.insertRow(row+1, [QtGui.QStandardItem(name),
QtGui.QStandardItem(point)])
else:
self.model.appendRow([QtGui.QStandardItem(name),
QtGui.QStandardItem(point)])
else:
self.model.setData(self.model.index(row_edit, 1), point, QtCore.Qt.EditRole)
if __name__ == "__main__":
application = QtWidgets.QApplication([])
window = Counter()
window.setWindowTitle("Counter")
window.setMinimumSize(480, 380)
window.show()
sys.exit(application.exec_())
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Например, если взять горизонтальный хедер, и нам надо растянуть колонки на всю ширину таблицы (метод QHeaderView.setSectionResizeMode):
tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
остальные флаги тут
или, если для конкретной колонки, то так:
tableView.horizontalHeader().setSectionResizeMode(column, QHeaderView.Stretch)
Что касается сохранения после закрытия, например главного окна приложения, то надо перегрузить метод closeEvent у закрываемого окна:
class Window(QMainWindow):
def closeEvent(self, event):
settings = QtCore.QSettings('sets.ini', QtCore.QSettings.IniFormat)
settings.setValue("key", "Value")
чтения и другая информация в документации
Сохранение настроек в конструкторе главного окна (проверено - работает!):
from PyQt5.QtCore import QSettings
def Window(QMainWindow):
def __init__(self, parent=None)
settings = QSettings('sets.ini', QSettings.IniFormat)
settings.setValue("Key", "Value")