4

pyqt アプリケーションに QTreeView のカスタム サブクラスがあります。ユーザーが行を強調表示および「ローライト」(より適切な用語がないため) できるようにしようとしています。強調表示された行には、太字のテキストと (オプションで) 別の背景色を使用する必要があります。何か案は?
オプションとして StyleSheets を検討していますが、これまでのところそれを機能させることができていません。QTreeView のスタイルシートを設定した場合:

self.setStyleSheet("QTreeView::item:selected {border: 1px solid #567dbc;}")

特定の状態で目的の行のみを保持する「状態」を手動で有効にする方法がわかりません。個々のアイテムのスタイルシートを設定しようとすると:

#modelIndex is a valid QModelIndex
modelIndex.internalPointer().setStyleSheet()

セグメンテーション違反が発生します。
私はスタイルシートが正しい道だとは確信していません。私はすべてのアイデアを受け入れます。ありがとう!

4

2 に答える 2

8

あなたが言ったことから、最も簡単な解決策は、ツリービューのカスタムアイテムデリゲートを定義し、必要なときにアイテムのフォントの太さを太字に設定することです。pls、以下の例があなたのために働くかどうかを確認してください、それはアイテムのフォントスタイルを変更するカスタムアイテムデリゲートでツリービューを作成する必要があります。

import sys
from PyQt4 import QtGui, QtCore

class BoldDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        # decide here if item should be bold and set font weight to bold if needed 
        option.font.setWeight(QtGui.QFont.Bold)
        QtGui.QStyledItemDelegate.paint(self, painter, option, index)


class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        model = QtGui.QStandardItemModel()

        for k in range(0, 4):
            parentItem = model.invisibleRootItem()
            for i in range(0, 4):
                item = QtGui.QStandardItem(QtCore.QString("item %0 %1").arg(k).arg(i))
                parentItem.appendRow(item)
                parentItem = item

        self.view = QtGui.QTreeView()
        self.view.setModel(model)
        self.view.setItemDelegate(BoldDelegate(self))

        self.setCentralWidget(self.view)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

これがお役に立てば幸いです

于 2010-04-24T14:56:13.120 に答える
3

これを行う方法はいくつか考えられます。モデルにアクセスできる場合、最も簡単な方法は、モデル内のインデックスの状態追跡を追加し、data() 関数で要求されたロールに適切なオプションを返すことです。これの欠点は、同じモデルを異なるビューで使用していて、ハイライトを 1 つのビューに限定したい場合です。

2 番目に簡単なのは、データ自体を追跡し、元のモデルから他のすべてのデータを取得するプロキシ モデルを作成することです。この状況 (元のモデルの行または列を変更していない場合) では、おそらく非常に簡単です。

最も難しいのは、強調表示する必要がある行/列を追跡し、描画しているモデル インデックスの行/列に基づいて別の方法で描画するカスタム デリゲートを作成することです。どの行と列を設定する必要があるかをデリゲートに伝えることができるように、デリゲートへのアクセスを維持する必要があります。また、モデルが変更されたときに何が起こるかに対処する必要があります。

于 2010-04-23T16:31:42.957 に答える