4

だからここに話があります:

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)

私が今直面している問題:

  1. 通常の (太字ではない) アイテムはわずかにインデントされています (数ピクセル)。これはおそらくデフォルトの動作です。アイテムを太字にすることもできますが、別のプラットフォームではどうなりますか?
  2. 通常、アイテムを選択すると、点線で囲まれた小さな境界線が表示されます (デフォルトの Windows のものですか?)。ここでも描けましたが、できるだけネイティブのままでいたいです。

今質問:

ある条件が満たされた場合にのみフォントの太さを変更し、残りはすべて変更しないカスタム デリゲートを作成する別の方法はありますか?

私も試しました:

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

しかし、それは見た目にまったく影響を与えないようです。エラーはなく、デフォルトの動作のみで、太字の項目はありません。

すべての提案を歓迎します!

4

1 に答える 1

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)
于 2009-09-23T13:48:35.090 に答える