Проблема с синхронизацией PySide2 QListView QTableView

Это проблема, связанная с интерфейсом python/PySide2, сколько я ни пытался, я не смог синхронизировать его (QListView и QTableView).

Я попытаюсь упростить это, вместо того, чтобы объяснять всю сложную вещь, которая намного больше, с полным количеством форм в QT...

Просто представьте, что у вас есть структура данных (я думаю, модель), подобная следующей:

dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}

Я хотел бы иметь форму (или диалог) с двумя частями:

1) В левой части формы иметь QListView для визуализации следующего:

*dict1
------
dict2
-----
dict3

ПРИМЕЧАНИЯ:

  • Звездочка в dict1 означает, что выбрано.

  • Дефисы предназначены только для разделения строк.

2) В правой части формы иметь QTableView, показывающий следующее:

k1 | v1
-------
k2 | v2
-------
k3 | v3

ПРИМЕЧАНИЯ:

  • Дефисы предназначены только для разделения строк.

  • Трубы просто обозначают разделение столбцов.

  • Каждый раз, когда вы выбираете другой элемент в QListView, QTableView должен измениться на тот, который указан исходной структурой данных.

Я уверен, что это может быть очень легко для большинства из вас, ребята, но я только начинаю с UI и MVC.


person eddy2k    schedule 03.01.2019    source источник
comment
Рекомендую перейти сразу к делу, длинные речи, которые совершенно не способствуют, отбивают у вас охоту помогать.   -  person eyllanesc    schedule 03.01.2019
comment
Я уже говорил вам, что вы должны задать еще один вопрос, пожалуйста, сделайте это, вы только шумите. В SO вопросы должны быть максимально точными, если у вас много вопросов в одном посте, идите против этого. Помните, что на кнопке для создания сообщения написано Задать вопрос, а не Задать вопросs.   -  person eyllanesc    schedule 03.01.2019
comment
так что извините, я действительно здесь новичок, не хочу беспокоить   -  person eddy2k    schedule 03.01.2019
comment
Также рекомендуется просмотреть руководства по SO: tour, Как спросить и Как ответить, чтобы вы знали динамику место. Наконец, вы, вероятно, не можете задавать вопросы, пока не пройдет некоторое время.   -  person eyllanesc    schedule 03.01.2019


Ответы (1)


Вы должны создать модель с древовидной структурой, в которой видна зависимость, и в случае QListView она покажет корневые элементы, а в случае QTableView она покажет листья и будет иметь в качестве rootIndex выбранный QModelIndex из QListView. В образовательных целях я покажу модель дерева в QTreeView.

from PySide2 import QtCore, QtGui, QtWidgets

dict_of_dicts={
    'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
    'dict2':{'k4':'v4'},
    'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}

def create_model_from_dict(d, parent=None):
    model = QtGui.QStandardItemModel(0, 2, parent)
    for k, v in dict_of_dicts.items():
        it = QtGui.QStandardItem(k)
        model.appendRow(it)
        for k_, v_ in v.items():
            it.appendRow([QtGui.QStandardItem(k_), QtGui.QStandardItem(v_)])
    return model

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        model = create_model_from_dict(dict_of_dicts, self)

        self.tableview = QtWidgets.QTableView()
        self.tableview.setModel(model)

        self.listview = QtWidgets.QListView()
        self.listview.setModel(model)
        self.listview.selectionModel().selectionChanged.connect(self.handleSelectionChanged)
        self.listview.selectionModel().select(model.index(0, 0), QtCore.QItemSelectionModel.Select)

        self.treeview = QtWidgets.QTreeView()
        self.treeview.setModel(model)
        self.treeview.expandAll()

        hlay = QtWidgets.QHBoxLayout(self)
        hlay.addWidget(self.listview)
        hlay.addWidget(self.tableview)
        hlay.addWidget(self.treeview)

    @QtCore.Slot(QtCore.QItemSelection)
    def handleSelectionChanged(self, item):
        ixs = item.indexes()
        if ixs:
            self.tableview.setRootIndex(ixs[0])

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person eyllanesc    schedule 03.01.2019