Так вот история:Пользовательские 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)
Проблема я столкнулся в настоящее время:
- нормальных (не жирный) деталь слегка отступ (несколько пикселей). Это, по-видимому, поведение по умолчанию . Я мог бы отступывать свой пункт в полужирным шрифтом, но что происходит тогда под другой платформой?
- Обычно, когда я выбираю элементы, есть небольшая граница с пунктирной линией вокруг нее (по умолчанию Windows?). Здесь также я мог бы нарисовать его, но я хочу оставаться как можно более родным.
Теперь вопрос:
Есть еще один способ, чтобы создать пользовательский делегат, который только изменяет вес шрифта, когда некоторое условие встретилось и оставляет все нетронутым?
Я также попытался:
if value:
font = painter.font()
font.setWeight(QFont.Bold)
painter.setFont(font)
QStyledItemDelegate.paint(self, painter, option, index)
Но это, похоже, не влияет на внешний вид на всех. Нет ошибок, просто поведение по умолчанию и не выделены жирным шрифтом.
Все предложения приветствуются!