2017-03-02 12 views
0

Ich möchte eine Unterklasse a QAbstractItemModel erstellen, um sie in QTreeView zu verwenden. Zunächst entschied ich mich, ein minimalistisches Modell ohne Hierarchie zu erstellen. Es sollte eine 2-mal-3-Tabelle mit einfachen Textdaten (nur lesbar) geben.QAbstractItemModel für QTreeView: was mache ich falsch?

Leider, es stürzt nicht ab, zeigt aber keine Daten: nur ein paar Spaltenüberschriften (1, 2). Kann mir nicht jemand sagen, was mache ich falsch?

import os, sys 

from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg 

from PyQt5.QtCore import QPointF, QRectF 
from PyQt5.QtWidgets import QGraphicsItem 


from gui.graphic_items import * 



class MegaModel(QtCore.QAbstractItemModel): 
    def __init__(self, parent=None): 
     super().__init__(parent) 

     self._root_item = 7.40 
     pass 

    def columnCount(self, parent_index): 
     if parent_index.isValid(): 
      return 0 
     else: 
      return 2 

    def rowCount(self, parent_index): 
     if parent_index.isValid(): 
      return 0 
     else: 
      return 3 

    def data(self, index, role): 
     if index.isValid(): 
      return QtCore.QVariant("Oy vey!") 
     else: 
      return None 

    def index(self, row, column, parent=QtCore.QModelIndex()): 
     print("index", row, column, parent) 

     if parent.isValid(): 
      print("valid") 
      return parent.internalPointer() 
     else: 
      print("invalid") 
      return self.createIndex(row, column, self._root_item) 

    def parent(self, index): 
     return QtCore.QModelIndex() 


if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 


    mega_view = QtWidgets.QTreeView() 

    mega_model = MegaModel() 

    mega_view.setModel(mega_model) 

    mega_view.show() 

    sys.exit(app.exec_()) 
+0

Warum Sie zurückgeben 'parent.internalPointer()' 'von index' Methode, wenn' parent' Index gültig? – Dmitry

+0

Nun, ich habe gerade versucht, dies zu ändern, um 'QtCore.QModelndex()' zurückzugeben, wenn 'Eltern' gültig ist. Nichts ist gechartet, die gewünschten Zellen erscheinen nicht ... – Felix

+0

Da ist auch der zweite Fehler, siehe meine Antwort. – Dmitry

Antwort

1

Zwei Fehler:

  1. Sie sollten nicht parent.internalPointer() von index Methode zurückgeben - diese Methode nicht das Modell der gespeicherten Werte zurückgibt, ist gemeint, nur Indizes Rückholeinzelteile zu modellieren
  2. In data Methode geben Sie QtCore.QVariant("Oy vey!") für alle Rollen zurück. Sie sollten wirklich nur zurückgeben dies für QtCore.Qt.DisplayRole, für andere Rollen, es ist ok None zurückzukehren:

    def data(self, index, role): 
        if not index.isValid(): 
         return None 
        if role == QtCore.Qt.DisplayRole: 
         return index.internalPointer() 
        else: 
         return None 
    
+0

Danke, Kamerad! Das ist es! // Добра тебе, умный человек!^_^ – Felix

+0

Kannst du dir das auch nicht ansehen? http://stackoverflow.com/questions/42565139/qabstractitemmodel-annoying-branch-line-in-qtreewiew – Felix

+0

UPD: bereits behoben, die tree.siblings() gab nur die Geschwister eines Knotens (der Knoten selbst wurde nicht aufgeführt) . – Felix