2009-09-11 4 views
4

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

У меня есть 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) 

Проблема я столкнулся в настоящее время:

  1. нормальных (не жирный) деталь слегка отступ (несколько пикселей). Это, по-видимому, поведение по умолчанию . Я мог бы отступывать свой пункт в полужирным шрифтом, но что происходит тогда под другой платформой?
  2. Обычно, когда я выбираю элементы, есть небольшая граница с пунктирной линией вокруг нее (по умолчанию Windows?). Здесь также я мог бы нарисовать его, но я хочу оставаться как можно более родным.

Теперь вопрос:

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

Я также попытался:

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

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

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

ответ

3

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

class TypeSoortDelegate(QStyledItemDelegate): 

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

    QStyledItemDelegate.paint(self, painter, option, index)