Wie kann das umständliche Übermalen von Delegate-Zeilen in einem QTreeView verfeinert werden?
Posted: 15 Jan 2025, 17:59
Im Zentrum meiner Python/Qt-Anwendung steht eine tabellarische Ansicht mit QTreeView. In einer Spalte habe ich Sparklines implementiert, indem ich eine Unterklasse von QStyledItemDelegate bildete, die Datenelemente in der entsprechenden Spalte als Numpy-Arrays festlegte und diese in der Paint-Methode des Delegaten darstellte.
Meine Liniendiagramme gehen leicht über die Begrenzungsrahmen hinaus, aber dieser Effekt gefällt mir (und ich möchte ihn behalten):

Wenn ich jedoch nach unten streiche, kommt es zu etwas Neulackierung und irgendwie auch zu einer Neulackierung des Hintergrunds, was zu einem führt Temporäres Bild, bei dem der neutrale Hintergrund die übermalten Linien auflöst:

Wenn ich das Fenster verlasse oder die Kopfzeile berühre, erfolgt erneut ein Neuanstrich, zurück zum ersten Bild.
Fragen
Wie und wo findet diese Neugestaltung des Hintergrunds statt und was kann ich tun, um sie zu beeinflussen? Ich bin überrascht, weil mein Benutzercode die Malmethode des Delegaten überschreibt und nur Linien zeichnet.
Meine Malmethode
Ich habe versucht, item.setBackground(brush) entweder mit einer undurchsichtigen oder einer transparenten QColor festzulegen. Keines davon hat etwas bewirkt, da mein Farbcode niemals eine Hintergrundmalerei aufruft.
Meine Liniendiagramme gehen leicht über die Begrenzungsrahmen hinaus, aber dieser Effekt gefällt mir (und ich möchte ihn behalten):

Wenn ich jedoch nach unten streiche, kommt es zu etwas Neulackierung und irgendwie auch zu einer Neulackierung des Hintergrunds, was zu einem führt Temporäres Bild, bei dem der neutrale Hintergrund die übermalten Linien auflöst:

Wenn ich das Fenster verlasse oder die Kopfzeile berühre, erfolgt erneut ein Neuanstrich, zurück zum ersten Bild.
Fragen
Wie und wo findet diese Neugestaltung des Hintergrunds statt und was kann ich tun, um sie zu beeinflussen? Ich bin überrascht, weil mein Benutzercode die Malmethode des Delegaten überschreibt und nur Linien zeichnet.
Meine Malmethode
Code: Select all
def paint(self, painter, option, index):
data = index.data(UserRole+1)
rectF = option.rect.toRectF()
ndims = self.ndims
yscale = self.yscale
midHeight = rectF.top() + rectF.height()/2
ctrLine = QtCore.QLineF( rectF.left(), midHeight,
rectF.right(), midHeight )
painter.setPen( self.midPen )
painter.drawLine( ctrLine )
painter.setPen( self.linePen )
segWidth = rectF.width() / (ndims-1)
for s in range(ndims-1):
seg = data[s:s+2]
segProj = -seg / yscale * rectF.height()
segLine = QtCore.QLineF( rectF.left() + s*segWidth,
midHeight + segProj[0],
rectF.left() + (s+1)*segWidth,
midHeight + segProj[1] )
painter.drawLine( segLine )