在QTreeView中设置粗体行

问题描述:

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

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

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

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

我收到段错误。
我不相信样式表是要走的路,我愿意接受所有想法。谢谢!

+0

无关的最终修复,但我周围的段错误了。我忘记了由qsortfilterproxy返回的内部指针需要转换为模型指针。因此: self.model()。sourceModel()。getItem(self.mapToSource(each)) – taynaron 2010-04-27 22:20:01

+0

我决定为每个项目添加一个QFont变量以跟踪项目的状态,然后使用委托绘制所有项目与自定义QFont。谢谢大家! – taynaron 2010-04-27 22:50:15

从你所说的话看来,最简单的解决方案将是为你的treeview定义一个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() 

希望这会有所帮助,至于

+0

另外一个是我曾经理解的自定义委托的第一个示例。通常有太多的花里胡哨的东西我不知道发生了什么。 – neuronet 2014-12-09 17:34:05

我可以想到一些方法来做到这一点。如果您有权访问模型,最简单的方法是添加模型中索引的状态跟踪,并返回data()函数中请求的角色的适当选项。这样做的缺点是,如果您在不同的视图中使用相同的模型,并希望将高光局部保留在一个视图中。

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

最难的是制作一个自定义委托,以跟踪哪些行/列应该高亮显示,并根据所绘制的模型索引的行/列自行绘制。你将不得不保持对委托的访问,以便你可以告诉它哪些行和列需要设置。您还需要处理模型更改时发生的情况。

+0

我希望所有视图都能看到状态,但模型会在后台定期更新,所以我想我会为项目本身添加一些状态。 但是,一旦我设置了状态变量并且可以访问,我仍然不确定如何实际将项目显示为粗体。 – taynaron 2010-04-23 23:18:07

+1

@taynaron:模型的数据函数为要返回的数据的角色提供一个参数。赔率是你只看着DisplayRole,并返回要绘制的数据。但是,还有一个FontRole可用于返回用于呈现项目的字体(因此为粗体),以及可用于更改用于绘制这些项目的颜色的BackgroundColorRole和TextColorRole。这是前两个(模型)选项。委托选项有一个绘制方法,您必须重写并绘制粗体文本。 – 2010-04-24 14:58:56