如何让QTableView选择不影响DecorationRole设置的QIcons/QPixmaps?

How to make QTableView selection not affect QIcons/QPixmaps set by DecorationRole?

我正在使用 PyQt6,并且有一个自定义 QTableView 和一个自定义 QTableModel。该模型的数据方法如下所示:

    def data(self, index: QModelIndex, role: Qt.ItemDataRole = Qt.ItemDataRole.DisplayRole):
        if role == Qt.ItemDataRole.DecorationRole:
            if not index.column():
                # print(index.row())
                artwork_pixmap = self._tracks[index.row()].artwork_pixmap
                artwork_pixmap = artwork_pixmap if artwork_pixmap else QPixmap(f"icons/album.png")
                icon = QIcon(artwork_pixmap)
                return icon

_tracks 是一个包含自定义对象的列表,这些对象具有我想要显示的像素图,如果没有,那么我只显示图像 album.png 中的默认像素图。一切正常,QIcons 显示在第一列中。但是一旦我 select 该行它也会使 QIcon 变蓝,这不是我想要的。无论我的视图样式表中设置的 selection 颜色如何,它都会使它偏蓝。即使我将它的焦点策略设置为 NoFocus,它也不会 select 单击任何内容,但它仍然会使我单击的行中的 QIcon 变成蓝色。有什么办法可以防止这种情况吗?

这是例子,第一行是我点击的,背景颜色没有因为NoFocus而改变,但是QIcon与正常颜色相比变得偏蓝。

QIcon 自动为 DisabledSelected icon modes 创建给定像素图的替代版本,第一个是像素图的灰色版本,第二个基于调色板 Highlight 角色。

要覆盖这些图标,只需使用 addPixmap():

显式设置所需状态的像素图
    artwork_pixmap = self._tracks[index.row()].artwork_pixmap
    if not artwork_pixmap:
        artwork_pixmap = QPixmap("icons/album.png")
    icon = QIcon(artwork_pixmap)
    icon.addPixmap(artwork_pixmap, QtGui.QIcon.Selected)
    return icon