Domanda

Quindi, ecco la storia:

Ho una QListview che usa un QSqlQueryModel per riempirlo. Poiché alcuni elementi devono essere visualizzati in grassetto in base al valore di una colonna nascosta del modello, ho deciso di creare il mio delegato personalizzato. Sto usando PyQT 4.5.4 e quindi ereditare da QStyledItemDelegate è la strada da percorrere secondo i documenti. Ho funzionato ma ci sono alcuni problemi.

Ecco la mia soluzione:

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)

I problemi che sto affrontando ora:

  1. sono gli elementi normali (non in grassetto) leggermente rientrato (alcuni pixel). Questo è probabilmente un valore predefinito comportamento. Potrei rientrare il mio oggetto anche audace, ma cosa succede allora sotto una piattaforma diversa?
  2. Normalmente quando seleziono gli elementi c'è un piccolo bordo con una linea tratteggiata attorno (cosa predefinita di Windows?). Anche qui potrei disegnarlo, ma voglio rimanere il più nativo possibile.

Ora la domanda:

Esiste un altro modo per creare un delegato personalizzato che modifica il peso del carattere solo quando viene soddisfatta una condizione e non viene toccato tutto il resto?

Ho anche provato:

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

Ma questo non sembra influenzare affatto l'aspetto. Nessun errore, solo comportamento predefinito e nessun elemento in grassetto.

Tutti i suggerimenti sono benvenuti!

È stato utile?

Soluzione

Non l'ho provato, ma penso che tu possa fare:

class TypeSoortDelegate(QStyledItemDelegate):

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

    QStyledItemDelegate.paint(self, painter, option, index)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top