Frage

Ich kann ein QTreeWidgetItem nicht ordnungsgemäß in einem bestimmten Index einfügen. In diesem Fall entferne ich alle QTreeWidgetItems aus dem Baum, mache eine benutzerdefinierte Sortierung für ihre Datumsobjekte und füge sie dann wieder in das QTreewidget.

Beim Einsetzen (sogar jeweils sogar) wird das QTreewidgetItem nicht in die richtige Stelle eingefügt.

Der nachstehende Code druckt aus:

Index 0: 0

Index 0: 1 Index 1: 0

Index 0: 2 Index 1: 1 Index 2: 0

Index 0: 3 Index 1: 2 Index 2: 0 Index 3: 1

Index 0: 4 Index 1: 2 Index 2: 0 Index 3: 1 Index 4: 3

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0])

self.insertTopLevelItem(0, childrenList[1])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1])

self.insertTopLevelItem(0, childrenList[2])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ', \
    self.indexOfTopLevelItem(childrenList[2])

self.insertTopLevelItem(0, childrenList[3])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ',\
    self.indexOfTopLevelItem(childrenList[2]), 'index 3: ',\
    self.indexOfTopLevelItem(childrenList[3])

self.insertTopLevelItem(0, childrenList[4])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]),\
    ' index 1: ', self.indexOfTopLevelItem(childrenList[1]),\
    ' index 2: ', self.indexOfTopLevelItem(childrenList[2]),\
    'index 3: ', self.indexOfTopLevelItem(childrenList[3]),\
    'index 4: ', self.indexOfTopLevelItem(childrenList[4])
War es hilfreich?

Lösung

Sie können Ihre benutzerdefinierte Sortierung ohne Auffüllen von Baum durchführen. Sie müssen nur den "weniger" Operator des Elements überlasten. Beachten

virtual QVariant data ( int column, int role ) const

Wenn Sie ein Element erstellen, geben Sie dem Konstruktor eine Zeichenfolge zur Verfügung, damit Element angezeigt wird. Diese Zeichenfolge wird in Daten eingebaut (.., qtcore.qt.editrol), daher ist das Äquivalent zum Übergeben von Daten in den Konstruktor, Daten mit:

virtual void setData ( int column, int role, const QVariant & value)

Intern sind Daten nur ein Array, Sie können alles, was jünne Wünsche ist, und Indizes davon sind Rollen (Qt.Editrol ist 2, Qt.toolTiprole ist 3 usw.). Betreiber, um diese Werte zu vergleichen und SetData Set Displayrole zu sagen, wenn wir unsere, sagen wir, Valuerole. Hier ist das Beispiel:

class TreeItem(QtGui.QTreeWidgetItem):

    PythonValueRole = QtCore.Qt.UserRole

    #values are list of python objects, that have __str__ and can be compared
    def __init__(self, tree, values):
        QtGui.QTreeWidgetItem.__init__(self, tree)
        i = 0
        for v in values:
            self.setData(i, TreeItem.PythonValueRole, v)
            i += 1

    #overridden to simplify data assigning. When called with PythonValueRole, passes
    #that object's string representation to DisplayRole and EditRole
    def setData(self, col, role, value):
        if role == TreeItem.PythonValueRole:
            QtGui.QTreeWidgetItem.setData(self, col, TreeItem.PythonValueRole, value)
            # sets DisplayRole and EditRole
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.EditRole, str(value)) 
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.DisplayRole, str(value))
        else:
            QtGui.QTreeWidgetItem.setData(self, col, role, value)

    def __lt__(self, other):
        c = self.treeWidget().sortColumn()
        return self.data(c, TreeItem.PythonValueRole).toPyObject() < 
               other.data(c, TreeItem.PythonValueRole).toPyObject()

Ich habe getestet, es funktioniert gut. Von Cource können Sie Erbschaft vermeiden und außer Kraft setzen lt Direkt, da wir Enten -Typing hatten, verwenden Sie UserRole selbst, um Ihre Daten zu halten und Daten direkt mit SetData (Col, Rolle, VAL) anzuzeigen, oder halten Sie sogar nur Text in Bearbeitungs-/Anzeigerolle und konvertieren sie nur beim Vergleich in DateTime. Aber es scheint hässlich. Beachten Sie, dass Data () qvariant enthält. Wenn Sie Daten festlegen, konvertiert Ihr PY -Objekt automatisch und Sie müssen TopyObject () anrufen, um Ihren Wert so wie er zu erhalten.

Andere Tipps

Das Problem muss anderswo in Ihrem Code sein. Vielleicht entfernen Sie die Artikel nicht richtig? Weil die folgenden Funktionen funktionieren:

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

app = QApplication(sys.argv)

tree = QTreeWidget()
items = [QTreeWidgetItem(['index %i' % i]) for i in range(5)]

for item in items:
    tree.insertTopLevelItem(0, item)

print 'indexes: '
for item in items:
    print tree.indexOfTopLevelItem(item),

tree.show()

app.exec_()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top