PySide2 QListView QTableView同步问题

2024-04-19 15:35:45 发布

您现在位置:Python中文网/ 问答频道 /正文

这是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来可视化以下内容:

^{pr2}$

注意事项:

  • dict1中的星号表示已选中。

  • 连字符只是在行之间分隔开。

2)在表单的右侧,有一个显示以下内容的QTableView:

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

注意事项:

  • 连字符只是在行之间分隔开。

  • 管道,只是用来表示柱的分离。

  • 每次在QListView中选择另一个元素时,QTableView必须更改为原始数据结构所指示的元素。

我相信这对你们大多数人来说都很简单,但我只是从UI和MVC开始。在


Tags: 元素表单k2k1v3字符v2v1
1条回答
网友
1楼 · 发布于 2024-04-19 15:35:45

您必须创建一个具有树结构的模型,在这里可以看到依赖关系,对于QListView,它将显示根项,对于QTableView,它将显示叶,并且它将QListView的选定QModelIndex作为根索引。出于教育目的,我将在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_())

enter image description here

enter image description here

enter image description here

相关问题 更多 >