首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下钻QListWidget

下钻QListWidget
EN

Stack Overflow用户
提问于 2020-12-25 00:02:33
回答 1查看 45关注 0票数 0

我可以在QListWidget中显示一个项目列表,然后单击get the item selected。我似乎不知道如何向下钻取数据(我不想使用树视图)。

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

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

是否会隐藏顶层列表,创建新列表,并添加一个返回项元素,该元素将删除顶层并显示前一个列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-25 01:03:14

您可以使用带有QListView的树状结构的模型,并更改视图的rootIndex,而不是重新创建视图的信息:

代码语言:javascript
复制
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_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65440640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档