我在pyqt应用程序中有一个QTreeView的自定义子类。我试图让用户能够突出显示和“低亮”(缺少一个更好的术语)行。突出显示的行应具有粗体文本和(可选)不同的背景颜色。任何想法?
我正在考虑将StyleSheets作为一种选择,但到目前为止还无法让它发挥作用。如果我设置QTreeView的样式表:
self.setStyleSheet("QTreeView::item:selected {border: 1px solid #567dbc;}")
我无法弄清楚如何手动启用“状态”,只保留特定状态下的所需行。如果我尝试设置单个项目的样式表:
#modelIndex is a valid QModelIndex
modelIndex.internalPointer().setStyleSheet()
我得到了一个段错误 我不相信样式表是可行的方式,我对所有想法持开放态度。谢谢!
答案 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()函数中请求的角色返回正确的选项。这样做的缺点是,如果您在不同的视图中使用相同的模型,并希望将亮点保持在一个视图的本地。
第二个最简单的方法可能是创建一个代理模型,它跟踪数据本身,并从原始模型中获取所有其他数据。在这种情况下(你没有改变原始模型的行或列),它可能很容易。
最难的是创建一个自定义委托来跟踪哪些行/列应该突出显示,并根据它绘制的模型索引的行/列以不同方式绘制自己。您必须保持对委托的访问权限,以便您可以告诉它需要设置哪些行和列。您还需要处理模型更改时发生的情况。