Сохранить сортировки и ширины колонок таблиц в форме Pyqt5

Есть форма, в которой находится 10 таблиц QTabelView.
При работе с формой пользователь сам выбирает ширину колонок и сортировку.

Каждый раз при выходи из формы я собираю название таблиц и в цикле сохраняю выбранные настройки в config файл и соответственно каждый раз их загружаю при в входе в форму.

Хотелось бы узнать если PyQt возможность делать это более просто.
Некая настройка, которая сохраняет всю структуру формы глобально для экрана.


Ответы (2 шт):

Автор решения: Sergey Tatarincev

Это очень просто. Сохраним и размеры колонок и сортировки буквально в пару строк. Помимо размеров сохранятся и растяжения (если есть столбцы 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)
→ Ссылка
Автор решения: Sergey Tatarincev

См. комментарии

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())
→ Ссылка