मैं QListWidget में आइटम्स की एक सूची दिखा सकता हूं, और क्लिक पर आइटम का चयन कर सकता हूं। मैं यह नहीं समझ सकता कि डेटा को कैसे ड्रिल किया जाए (मैं ट्री व्यू का उपयोग नहीं करना चाहता)।

तो उदाहरण के तौर पर, पहली सूची टीवी शो की सूची हो सकती है। किसी शो पर क्लिक करने से ऋतुओं की सूची दिखाई देती है। किसी सीज़न पर क्लिक करने से एपिसोड की सूची दिखाई देती है।

मैं आइटम को वापस पेड़ में साफ़ और जोड़ सकता हूं, लेकिन मैं पिछली सूची में वापस जाने की क्षमता बनाए रखना चाहता हूं।

शीर्ष सूची को छिपाएगा, नई सूची बनाएगा, और एक बैक आइटम तत्व को क्लिक करेगा जो शीर्ष स्तर को हटा देता है और पिछली सूची दिखाता है?

0
MavWolverine 24 पद 2020, 19:02

1 उत्तर

सबसे बढ़िया उत्तर

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_())
2
eyllanesc 24 पद 2020, 20:08
धन्यवाद यह मुझे वांछित परिणाम देता है (हालांकि मुझे आधा कोड समझ में नहीं आया, फिर भी पीईक्यूटी 5 के लिए नया)। क्या मैं यह आलसी लोडिंग कर सकता हूँ? जैसे आइटम 3 पर क्लिक करना एक एपीआई कॉल करता है जो आइटम 3-1, आइटम 3-2 देता है ....
 – 
MavWolverine
25 पद 2020, 06:29
क्या मैं यह आलसी लोडिंग कर सकता हूँ? हां, आप ऐसा कर सकते हैं, QAbstractItemModel वर्ग की canFetchMore और fetchMore विधि की जांच करें।
 – 
eyllanesc
25 पद 2020, 07:35