在QTreeView中设置粗体行

时间:2010-04-23 06:47:16

标签: qt pyqt stylesheet qtreeview

我在pyqt应用程序中有一个QTreeView的自定义子类。我试图让用户能够突出显示和“低亮”(缺少一个更好的术语)行。突出显示的行应具有粗体文本和(可选)不同的背景颜色。任何想法?
我正在考虑将StyleSheets作为一种选择,但到目前为止还无法让它发挥作用。如果我设置QTreeView的样式表:

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

我无法弄清楚如何手动启用“状态”,只保留特定状态下的所需行。如果我尝试设置单个项目的样式表:

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

我得到了一个段错误 我不相信样式表是可行的方式,我对所有想法持开放态度。谢谢!

2 个答案:

答案 0 :(得分:6)

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

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()

希望这有帮助,尊重

答案 1 :(得分:3)

我可以想到几种方法来做到这一点。如果您有权访问模型,最简单的方法是在模型中添加索引的状态跟踪,并为data()函数中请求的角色返回正确的选项。这样做的缺点是,如果您在不同的视图中使用相同的模型,并希望将亮点保持在一个视图的本地。

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

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