微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向下钻取 QListWidget

如何解决向下钻取 QListWidget

我可以在 QListWidget 中显示项目列表,然后单击选择项目。我似乎无法弄清楚如何向下钻取数据(我不想使用树视图)。

例如,第一个列表可以是电视节目列表。单击一个节目会显示季节列表。点击一个季节会显示剧集列表。

我可以清除项目并将其添加回树中,但我想保留返回上一个列表的能力。

是否会隐藏顶级列表,创建新列表,并添加一个后退项目元素,点击删除顶级并显示一个列表?

解决方法

不是重新创建 QListWidget 的信息,您可以使用具有树状结构的模型和 QListView 并更改视图的根索引:

import sys

from PyQt5 import QtCore,QtGui,QtWidgets

data = {
    "item1": {
        "item 1-1": ["item 1-1-1","item 1-1-2","item 1-1-3"],"item 1-2": ["item 1-2-1","item 1-2-2","item 1-2-3"],"item 1-3": ["item 1-3-1","item 1-3-2","item 1-3-3"],},"item2": {
        "item 2-1": ["item 2-1-1","item 2-1-2","item 2-1-3"],"item 2-2": ["item 2-2-1","item 2-2-2","item 2-2-3"],"item 2-3": ["item 2-3-1","item 2-3-2","item 2-3-3"],"item3": {
        "item 3-1": ["item 3-1-1","item 3-1-2","item 3-1-3"],"item 3-2": ["item 3-2-1","item 3-2-2","item 3-2-3"],"item 3-3": ["item 3-3-1","item 3-3-2","item 3-3-3"],}

# https://stackoverflow.com/a/53747062
def fill_model_from_json(parent,d):
    if isinstance(d,dict):
        for k,v in d.items():
            child = QtGui.QStandardItem(str(k))
            parent.appendRow(child)
            fill_model_from_json(child,v)
    elif isinstance(d,list):
        for v in d:
            fill_model_from_json(parent,v)
    else:
        parent.appendRow(QtGui.QStandardItem(str(d)))


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

        self.view = QtWidgets.QListView()
        self.button = QtWidgets.QPushButton("Up")

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.view)
        lay.addWidget(self.button)

        self.button.setEnabled(False)

        self.view.clicked.connect(self.handle_view_clicked)
        self.button.clicked.connect(self.handle_button_clicked)

        model = QtGui.QStandardItemModel()
        self.view.setModel(model)

        fill_model_from_json(model.invisibleRootItem(),data)

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def handle_view_clicked(self,index):
        if self.view.model().hasChildren(index):
            self.view.setRootIndex(index)
        self.button.setEnabled(self.view.rootIndex().isValid())

    @QtCore.pyqtSlot()
    def handle_button_clicked(self):
        self.view.setRootIndex(self.view.rootIndex().parent())
        self.button.setEnabled(self.view.rootIndex().isValid())


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。