有条件地更改连接到QFileSystemModel的QListView中的文件颜色

时间:2016-10-31 09:33:54

标签: python pyqt qitemdelegate qfilesystemmodel

我的QListView有一个QFileSystemModel。根据{{​​1}}中的选择,QTreeView显示文件夹的内容 现在我需要根据某些条件更改文件名的颜色。
最初的想法是迭代QListView中的项目,并根据条件是否满足来设置每个项目的颜色。然而,这似乎是不可能的,因为QListView setData()方法仅接受对QFileSystemModel的更改,忽略了[看this]

之类的内容
EditRole

这也被指出here 后者的建议是将self.FileModel.setData(index, QtGui.QBrush(QtCore.Qt.red), role=QtCore.Qt.ForegroundRole) 子类化,以便为QListView中的项目着色。

因此,我将QItemDelegate子类化,并重新实现其QStyledItemDelegate方法,以绿色显示文件名,如果满足条件 - 这样可以正常工作。然而它现在看起来有点丑陋:文件图标丢失了" mouse_over"效果不再有效。

虽然这个子类化无论如何都是一个混乱的解决方法,但我的顶级问题是

  • 有没有办法根据条件为连接到paint()的{​​{1}}中的项目着色?

现在规定可能不是这种情况并且坚持QItemDelegate的子类化,

  • 有没有办法让好的选择和图标恢复原来的行为?
  • 有没有人知道哪个ItemDelegate最初用于QListView中的QFileSystemModel以及如何使用它?
  • 是否可以获取其源代码并从那里复制paint方法?

这是一个使用子类的最小代码,并显示了descibed行为。它使用QListView,其中可以键入字符串,以便包含该字符串的所有文件都以绿色突出显示。

QFileSystemModel

这是它与QItemDelegate的子类化的比较:

enter image description here

这个代码的另一个问题是,一旦条件发生变化,就需要将鼠标移动到QFileView中以启动重新绘制。我想知道我可以使用哪个插槽连接到QLineEdit信号来直接执行此操作。

1 个答案:

答案 0 :(得分:3)

不需要项目代表。通过重新实现data的{​​{1}}方法,可以更加简单地实现它:

QFileSystemModel