【问题标题】:Set bold rows in a QTreeView在 QTreeView 中设置粗体行
【发布时间】:2023-03-05 16:43:01
【问题描述】:

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

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

我不知道如何手动启用“状态”以仅将所需行保留在特定状态。如果我尝试设置单个项目的样式表:

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

我遇到了段错误。
我不相信样式表是要走的路,我对所有想法持开放态度。谢谢!

【问题讨论】:

  • 与最终修复无关,但我绕过了段错误。我忘记了 qsortfilterproxy 返回的内部指针需要转换为模型指针。因此:self.model().sourceModel().getItem(self.mapToSource(each))
  • 我决定为每个项目添加一个 QFont 变量以跟踪项目的状态,然后使用委托使用自定义 QFont 绘制所有项目。谢谢大家!

标签: qt pyqt stylesheet qtreeview


【解决方案1】:

从您所说的看来,最简单的解决方案是为您的树形视图定义一个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()

希望这会有所帮助,问候

【讨论】:

  • 另外一个是我所理解的自定义委托的第一个示例。通常有很多花里胡哨,我不知道发生了什么。
【解决方案2】:

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

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

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

【讨论】:

  • 我希望所有视图都可以查看状态,但是模型会在后台定期更新,所以我想我想为项目本身添加一些状态。但是,一旦我设置了状态变量并可以访问,我仍然不确定如何将这些项目实际显示为粗体。
  • @taynaron: 模型的数据函数带一个参数为角色的数据返回。很可能您只查看 DisplayRole,并返回要绘制的数据。但是,还有一个 FontRole 可用于返回用于呈现项目的字体(因此为粗体),以及 BackgroundColorRole 和 TextColorRole 可用于更改用于绘制这些项目的颜色。这是前两个(模型)选项。委托选项有一个绘制方法,您必须覆盖并绘制粗体文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多