Сохранить сортировки и ширины колонок таблиц в форме Pyqt5
Есть форма, в которой находится 10 таблиц QTabelView.
При работе с формой пользователь сам выбирает ширину колонок и сортировку.
Каждый раз при выходи из формы я собираю название таблиц и в цикле сохраняю выбранные настройки в config файл и соответственно каждый раз их загружаю при в входе в форму.
Хотелось бы узнать если PyQt возможность делать это более просто.
Некая настройка, которая сохраняет всю структуру формы глобально для экрана.
Ответы (2 шт):
Это очень просто. Сохраним и размеры колонок и сортировки буквально в пару строк. Помимо размеров сохранятся и растяжения (если есть столбцы Stretch) и если используется - какие столбцы скрыты для отображения.
save - сохранит состояние горизонтального заголовка для self.table, а restore соответственно загрузит из инишки и применит
def save(self):
settings = QSettings("config.ini", QSettings.IniFormat)
settings.beginGroup("main")
header = self.table.horizontalHeader().saveState()
settings.setValue("header", header)
settings.endGroup()
settings.sync()
def restore(self):
settings = QSettings("config.ini", QSettings.IniFormat)
settings.beginGroup("main")
value = QVariant(settings.value("header", None))
if value:
state = value.value()
self.table.horizontalHeader().restoreState(state)
См. комментарии
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QPushButton, QTableWidget
from PyQt5.QtCore import QSettings, QVariant
class MainWindow(QMainWindow):
# функция сохранения. В качестве параметра передается объект QTableWidget
def saveTable(self, table):
settings = QSettings("config.ini", QSettings.IniFormat)
settings.beginGroup("main")
header = table.horizontalHeader().saveState()
settings.setValue(f'{table.objectName()}_header', header)
settings.endGroup()
settings.sync()
# функция восстановления заголовка. В качестве параметра передается объект QTableWidget
def restoreTable(self,table):
settings = QSettings("config.ini", QSettings.IniFormat)
settings.beginGroup("main")
value = QVariant(settings.value(f'{table.objectName()}_header', None))
if value.value():
table.horizontalHeader().restoreState(value.value())
# сохранение заголовков всех объектов
# ВАЖНО. детишки типа QTableWidget будут искаться непосредственно на главном окне.
# Если таблицы в контейнерах (табы, фреймы), то искать надо именно в них
# Или делать рекурсивную функцию обхода всего дерева объектов
def saveClicked(self):
for child in self.findChildren(QTableWidget):
self.saveTable(child)
# То же что сохранение
def loadClicked(self):
# Ищем все таблицы, расположенные на self и восстанавливаем их заголовок
for child in self.findChildren(QTableWidget):
self.restoreTable(child)
self.repaint()
def __init__(self):
QMainWindow.__init__(self)
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
self.grid_layout = QGridLayout()
central_widget.setLayout(self.grid_layout)
for i in range(1,6):
self.table = QTableWidget(self)
self.table.setColumnCount(4)
self.table.setRowCount(2)
self.table.setRowCount(100)
self.table.setHorizontalHeaderLabels(["one", "two", "three", "four"])
self.table.setObjectName(f"table{i}")
self.grid_layout.addWidget(self.table, i, 0,1,2)
self.savebutton = QPushButton("save")
self.grid_layout.addWidget(self.savebutton, 6, 0)
self.savebutton.clicked.connect(self.saveClicked)
self.loadbutton = QPushButton("load")
self.grid_layout.addWidget(self.loadbutton, 6, 1)
self.loadbutton.clicked.connect(self.loadClicked)
if __name__ == "__main__":
app = QApplication(sys.argv)
mw = MainWindow()
mw.showMaximized()
sys.exit(app.exec())