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

从您所说的看来,最简单的解决方案是为您的树视图定义一个自定义项目委托,并在需要时将项目字体粗细设置为粗体。请检查下面的示例是否适合您,它应该创建一个带有自定义项目委托的树视图,这将更改项目的字体样式。

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() 函数中请求的角色返回适当的选项。这样做的缺点是,如果您在不同的视图中使用相同的模型,并且希望将高光保持在一个视图的本地。

第二个最简单的方法可能是制作一个代理模型,它跟踪数据本身,并从原始模型中获取所有其他数据。在这种情况下(您没有更改原始模型的行或列),这可能很容易。

最难的是制作一个自定义委托来跟踪应该突出显示哪些行/列,并根据它正在绘制的模型索引的行/列以不同的方式绘制自身。您必须保留对委托的访问权限,以便您可以告诉它需要设置哪些行和列。您还需要处理模型更改时发生的情况。

于 2010-04-23T16:31:42.957 回答