Экспорт / сохранение содержимого QTreeView во вложенный словарь - PullRequest
0 голосов
/ 11 октября 2019

После средней доработки кода и его сокращения до минимума, я снова пришел к точке, где, очевидно, я что-то упускаю. В общем, идея состоит в том, чтобы заполнить QTreeView данными из словаря, внести изменения в значения и затем загрузить обратно данные из QTreeView в словарь. Словарь является вложенным и пара ключ: значение может достигать другого уровня вниз.

Код следующий:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtGui
from PyQt5 import QtWidgets

"""
Define main Config window
"""
class guiWindowConfig(QtWidgets.QDialog):

    def __init__(self):
        super().__init__()

        # Initialize dictionary
        self.exe_initiate_dictionary()

        # Initialize window
        self.init_window()

        # Initialize widgets
        self.init_trvConfig()
        self.init_btnDict2View()
        self.init_btnView2Dict()

        # Show window
        self.show()

    def init_window(self):
        # Window config
        self.int_left = 200
        self.int_top = 100
        self.int_width = 1000
        self.int_height = 530
        self.setWindowTitle("Define configuration variables")
        self.setFixedSize(self.int_width, self.int_height)
        self.move(self.int_left, self.int_top)

    def init_trvConfig(self):
        self.trvConfig = QtWidgets.QTreeView(self)
        self.trvConfig.setGeometry(10, 10, 980, 400)
        self.trvConfig.setUniformRowHeights(True)
        self.trvConfig.setRootIsDecorated(True)
        self.trvConfig.setAlternatingRowColors(True)

        self.modConfig = QtGui.QStandardItemModel()
        self.modConfig.setHorizontalHeaderLabels(['Variable', 'Value'])
        self.trvConfig.setModel(self.modConfig)
        self.trvConfig.header().setDefaultSectionSize(305)

    def init_btnDict2View(self):
        self.btnEditData = QtWidgets.QPushButton(self)
        self.btnEditData.setGeometry(10, 480, 140, 40)
        self.btnEditData.setText("Dictionary to QTreeView")
        self.btnEditData.clicked.connect(self.slot_dict_2_view)

    def init_btnView2Dict(self):
        self.btnEditData = QtWidgets.QPushButton(self)
        self.btnEditData.setGeometry(160, 480, 140, 40)
        self.btnEditData.setText("QTreeView to Dictionary")
        self.btnEditData.clicked.connect(self.slot_view_2_dict)

    # ----------------------------------------------------------------------------------------------------
    # Define slot functions
    # ----------------------------------------------------------------------------------------------------
    def slot_dict_2_view(self):
        self.exe_treeview_from_dict(self.modConfig, self.data)

    def slot_view_2_dict(self):
        self.data = self.exe_dict_from_treeview()
        pass

    # ----------------------------------------------------------------------------------------------------
    # Define core functions
    # ----------------------------------------------------------------------------------------------------
    def exe_initiate_dictionary(self):
        self.data = {}

        self.data["gui"] = {}
        self.data["gui"]["color"] = {}
        self.data["gui"]["color"]["active"] = "color: rgb(0, 0, 0); background-color: rgb(255, 255, 255)"

        self.data["menu"] = {}
        self.data["menu"]["submenu-1"] = True
        self.data["menu"]["submenu-2"] = True

        self.data["database"] = {}
        self.data["database"]["main"] = {}
        self.data["database"]["main"]["host"] = "localhost"
        self.data["database"]["main"]["port"] = "1433"
        self.data["database"]["main"]["database"] = "MAIN"

    def exe_treeview_from_dict(self, parent_item, dictionary):
        if isinstance(dictionary, dict):
            for key, value in dictionary.items():
                item_parent = QtGui.QStandardItem(str(key))
                if isinstance(value, dict):
                    parent_item.appendRow(item_parent)
                    self.exe_treeview_from_dict(item_parent, value)
                else:
                    item_child = QtGui.QStandardItem(str(value))
                    parent_item.appendRow([item_parent, item_child])

    def exe_dict_from_model(self, parent_item, dictionary):
        dict_value = {}
        for int_cnt in range(self.modConfig.rowCount(parent_item)):
            item_key = self.modConfig.index(int_cnt, 0, parent_item)
            item_value = self.modConfig.index(int_cnt, 1, parent_item)
            try:
                dict_value = self.modConfig.itemFromIndex(item_value).data()
            except:
                dict_value = {}
            self.exe_dict_from_model(item_key, dict_value)
        dictionary[parent_item.data()] = dict_value

    def exe_dict_from_treeview(self):
        output_dictionary = dict()
        for int_cnt in range(self.modConfig.rowCount()):
            item_index = self.modConfig.index(int_cnt, 0)
            self.exe_dict_from_model(item_index, output_dictionary)
        return output_dictionary

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = guiWindowConfig()
    window.show()
    sys.exit(app.exec_())

Все, кроме функции

exe_dict_from_model

работает. Я знаю, что это рекуррентная функция, которая вызывает себя из своего тела, но не знаю, как изменить ее, чтобы она заработала.

Идея функций

exe_dict_from_treeview
exe_dict_from_model

- создать словарь, которыйреплицирует исходный словарь, созданный функцией

exe_initiate_dictionary

, но со значениями, измененными при редактировании QTreeView.

...