-2

I use a QTreeView, I'd like to return an Item object (or data) instead of the item text when I click on the item in the TreeView

For example, TreeView has an item named "Banana"

|-Parent
| |-Banana
| |-Apple

when I click on the item "Banana"

I've already figured out how to get the item 'text'

my Code:

import sys

from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QTreeView
from PyQt5.QtCore import QModelIndex
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtGui import QStandardItem
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt

class Model(QStandardItemModel):

    def __init__(self, inputData):
        QStandardItemModel.__init__(self)

        # inputData
        # [ {"type": "Fruit", "objects": ["Apple", "Banana"]} ]
        d = inputData[0]  # Fruit
        item = QStandardItem(d["type"])
        child = QStandardItem(d["objects"][0])  # Apple
        item.appendRow(child)
        child = QStandardItem(d["objects"][1])  # Banana
        item.appendRow(child)
        self.setItem(0, 0, item)

class Form(QWidget):
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.setWindowTitle("ItemView QTreeView")
        self.setFixedWidth(210)
        self.setFixedHeight(150)

        # Data
        data = [
            {"type": "Fruit", "objects": ["Apple", "Banana"]}
        ]
        # QTreeView
        self.treeView = QTreeView(self)
        self.treeView.doubleClicked.connect(self.test)

        # Model
        self.model = Model(data)
        self.treeView.setModel(self.model)

    def test(self, selectedItem:QModelIndex):
        text = self.model.data(selectedItem)
        print(text)
        ### I want to make & get "Banana" Object (or data), not a text ###

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    exit(app.exec_())

But I'd like to get Data or Object

ex) Click 'Banana' -> return (Banana, color:Yellow, price:300)

isn't there a way to get information or objects of an item?

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Jiwon
  • 11
  • 2
  • 1
    provide a [mre] – eyllanesc Dec 16 '19 at 07:03
  • You can use [model.setData](https://doc.qt.io/qt-5/qabstractitemmodel.html#setData) to save custom information in your model. And you could overload the `model.data()` method to return a object, that is constructed using the custom data. – Tim Körner Dec 16 '19 at 09:02
  • You want me to return `(Banana, color: Yellow, price: 300)` but where have you set those values? – eyllanesc Dec 16 '19 at 15:53

1 Answers1

0

Thanks! Tim Körner.

I solved it.

...
item.setData(myObject)
...

    self.treeView = QTreeView(self)
    self.treeView.doubleClicked.connect(self.test)

    # Model
    self.model = Model(data)
    self.treeView.setModel(self.model)

def test(self, sel:QModelIndex):
    parentItem = self.treeView.item(
               sel.parent().row(), sel.parent.column())
    item = parentItem.child(sel.row(), sel.column)
    print(item.data()) # myObject
Jiwon
  • 11
  • 2