Пользовательский QStyledItemDelegate: добавление жирных элементов

StackOverflow https://stackoverflow.com/questions/1412156

  •  05-07-2019
  •  | 
  •  

Вопрос

Итак, вот история:

У меня есть QListview, который использует QSqlQueryModel, чтобы заполнить его. Поскольку некоторые элементы должны отображаться жирным шрифтом в зависимости от значения скрытого столбца модели, я решил создать свой собственный делегат. Я использую PyQT 4.5.4 и, таким образом, наследование от QStyledItemDelegate - это путь в соответствии с документами. Я получил это работает, но есть некоторые проблемы с этим.

Вот мое решение:

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)

Проблемы, с которыми я сталкиваюсь сейчас:

<Ол>
  • обычные (не полужирные) элементы слегка отступ (несколько пикселей). Это наверное какой-то дефолт поведение. Я мог бы сделать отступ в пункте жирным шрифтом, но что происходит потом под другой платформой?
  • Обычно, когда я выбираю элементы, вокруг них появляется небольшая рамка с пунктирной линией (по умолчанию в Windows?). Вот и я мог бы это нарисовать, но хочу остаться как можно более родным.
  • Теперь вопрос:

    Есть ли другой способ создать пользовательский делегат, который изменяет вес шрифта только при выполнении какого-либо условия и оставляет все остальное нетронутым?

    Я также попробовал:

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

    Но это никак не влияет на внешний вид. Никаких ошибок, только поведение по умолчанию и жирный шрифт.

    Все предложения приветствуются!

    Это было полезно?

    Решение

    Я не проверял это, но я думаю, что вы можете сделать:

    class TypeSoortDelegate(QStyledItemDelegate):
    
    def paint(self, painter, option, index):
        get value...
        if value:
            option.font.setWeight(QFont.Bold)
    
        QStyledItemDelegate.paint(self, painter, option, index)
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top