Frage

So, hier ist die Geschichte:

Ich habe einen QListView-Widget, das eine QSqlQueryModel verwendet sie aufzufüllen. Da einige Elemente in Fettschrift, basierend auf dem Wert einer versteckten Spalte des Modells angezeigt werden sollen, entschied ich mich, meine eigenen benutzerdefinierten Delegaten zu machen. Ich verwende PyQT 4.5.4 und damit von QStyledItemDelegate vererben ist der Weg nach der Dokumentation zu gehen. Ich habe es funktioniert, aber es gibt einige Probleme mit sich.

Hier ist meine Lösung:

class TypeSoortDelegate(QStyledItemDelegate):

    def paint(self, painter, option, index):
        model = index.model()
        record = model.record(index.row())
        value= record.value(2).toPyObject()
        if value:
            painter.save()
            # change the back- and foreground colors
            # if the item is selected
            if option.state & QStyle.State_Selected:
                painter.setPen(QPen(Qt.NoPen))
                painter.setBrush(QApplication.palette().highlight())
                painter.drawRect(option.rect)
                painter.restore()
                painter.save()
                font = painter.font
                pen = painter.pen()
                pen.setColor(QApplication.palette().color(QPalette.HighlightedText))
                painter.setPen(pen)
            else:
                painter.setPen(QPen(Qt.black))

            # set text bold
            font = painter.font()
            font.setWeight(QFont.Bold)
            painter.setFont(font)
            text = record.value(1).toPyObject()
            painter.drawText(option.rect, Qt.AlignLeft, text)

            painter.restore()
        else:
            QStyledItemDelegate.paint(self, painter, option, index)

Die Probleme, die ich bin jetzt vor:

  1. die normalen (nicht fett) Artikel sind leicht eingekerbt (wenige Pixel). Dies ist wahrscheinlich einige Standards Verhalten. Ich konnte meinen Artikel Einzug in bold auch, aber was passiert, dann unter einer anderen Plattform?
  2. Normalerweise, wenn ich Elemente auswählen, gibt es eine kleine Grenze mit einer gepunkteten Linie um ihn herum (Standard-Windows-Sache?). Auch hier konnte ich es zeichnen, aber ich möchte möglichst native bleiben.

Nun ist die Frage:

Gibt es eine andere Möglichkeit, eine benutzerdefinierte Delegierten zu erstellen, die nur die Schriftstärke ändert sich, wenn eine bestimmte Bedingung erfüllt ist, und lässt alles andere unberührt?

Ich habe auch versucht:

if value:
    font = painter.font()
    font.setWeight(QFont.Bold)
    painter.setFont(font)
QStyledItemDelegate.paint(self, painter, option, index)

Aber das scheint nicht gar das Aussehen zu beeinflussen. Kein Fehler, nur Standardverhalten und keine fett Elemente.

Alle Vorschläge willkommen!

War es hilfreich?

Lösung

Ich habe nicht getestet, aber ich denke, Sie tun können:

class TypeSoortDelegate(QStyledItemDelegate):

def paint(self, painter, option, index):
    get value...
    if value:
        option.font.setWeight(QFont.Bold)

    QStyledItemDelegate.paint(self, painter, option, index)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top