PySide2 QListView QTableView 同步问题

Posted

技术标签:

【中文标题】PySide2 QListView QTableView 同步问题【英文标题】:PySide2 QListView QTableView sync problem 【发布时间】:2019-01-03 07:58:02 【问题描述】:

这是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',

我想要一个包含 2 个部分的表单(或对话框):

1) 在表单的左侧,有一个 QListView 来可视化以下内容:

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

注意事项:

dict1 中的星号表示被选中。

连字符只是为了分隔行。

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

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

注意事项:

连字符只是为了分隔行。

管道,只是代表列的分离。

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

我相信这对你们大多数人来说真的很容易,但我只是从 UI 和 MVC 开始。

【问题讨论】:

我建议你直奔主题,冗长的演讲完全没有帮助阻止你提供帮助。 我已经告诉过你,你应该问另一个问题,请这样做,你只是在制造噪音。在 SO 中,问题应该尽可能精确,如果您在一篇文章中有很多问题,请反对它。请记住,创建帖子的按钮是 ,而不是 s 很抱歉,我是新来的,不想打扰 还建议您查看 SO 指南:tour、How to Ask 和 How to Answer,以便了解该地点的动态。最后,您可能要等到一段时间后才能提问。 【参考方案1】:

您必须创建一个具有树结构的模型,其中可以看到依赖项,并且在 QListView 的情况下,它将显示根项,在 QTableView 的情况下,它将显示叶子,并将作为 rootIndex 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_())

【讨论】:

以上是关于PySide2 QListView QTableView 同步问题的主要内容,如果未能解决你的问题,请参考以下文章

上一个问题 PySide2 QListView 和 QTableView 的新功能

Qt - 如何将 QListView 项目转移到另一个 QListView?

如何将标题设置为 QListView

如何让QListView显示多列 QTableView与QListView区别在哪里

为啥 QListView 中看不到文件图标?

PyQt5-高级控件使用(QListView)