だからここに話があります:
QSqlQueryModel を使用してそれを埋める QListview があります。モデルの隠し列の値に基づいて太字で表示される項目があるため、独自のカスタム デリゲートを作成することにしました。私は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)
しかし、それは見た目にまったく影響を与えないようです。エラーはなく、デフォルトの動作のみで、太字の項目はありません。
すべての提案を歓迎します!