मैं QListWidget में आइटम्स की एक सूची दिखा सकता हूं, और क्लिक पर आइटम का चयन कर सकता हूं। मैं यह नहीं समझ सकता कि डेटा को कैसे ड्रिल किया जाए (मैं ट्री व्यू का उपयोग नहीं करना चाहता)।
तो उदाहरण के तौर पर, पहली सूची टीवी शो की सूची हो सकती है। किसी शो पर क्लिक करने से ऋतुओं की सूची दिखाई देती है। किसी सीज़न पर क्लिक करने से एपिसोड की सूची दिखाई देती है।
मैं आइटम को वापस पेड़ में साफ़ और जोड़ सकता हूं, लेकिन मैं पिछली सूची में वापस जाने की क्षमता बनाए रखना चाहता हूं।
शीर्ष सूची को छिपाएगा, नई सूची बनाएगा, और एक बैक आइटम तत्व को क्लिक करेगा जो शीर्ष स्तर को हटा देता है और पिछली सूची दिखाता है?
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_())
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
pyqt5
पायथन प्रोग्रामिंग के लिए Qt5 बाइंडिंग। यह प्रोग्रामर को पायथन सिंटैक्स का उपयोग करके Qt5 ग्राफिकल यूजर इंटरफेस बनाने की अनुमति देता है।