选择时QListWidget项的单独背景颜色

时间:2014-02-16 13:17:00

标签: python qt python-3.x pyside qlistwidget

作为Python3 / PySide应用程序的一部分,我在QListWidget中有一个颜色独特的项目列表。在选择时,我希望在保持各自背景的同时使用某种颜色高亮显示这些项目,即

desired display

而不是如下图所示的全彩色版本

current display

主要通过颜色(背景与否)区分的项目可以使用拖动重新排列。用户始终能够看到当前选择的内容非常重要。

使用selection-color: solid rgba(255, 0, 0, 50%);未显示所需效果。

我不确定SO:Selected QListWidgetItem without changing text color中讨论的各个方面以及更多How to customize QListWidget with different highlight bar and spacing可能适用于我的问题。是否真的有必要在列表顶部添加另一个Widget?有没有办法在选择时对项目应用不同的画笔(使用PySide.QtGui.QListWidgetItem.setBackground(brush))?样式表似乎对我的情况没有帮助。

以下是精简代码:

import sys
import collections
from PySide import QtCore, QtGui

class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        #definition of colors and brushes (for colored backgrounds)
        layers = collections.OrderedDict(
            {1:('greenItem','g'),
             2:('yellowItem','y'),
             3:('mixedItem','m')})
        brushes = {'y': QtGui.QColor(255,200,0),
                   'g': QtGui.QColor(0,  160,0)}
        texSIG = QtGui.QPixmap(200,1)
        texSIG.fill(brushes['g'])
        paint = QtGui.QPainter()
        paint.begin(texSIG)
        paint.fillRect(80, 0, 40, 1, brushes['y'])
        paint.end()
        brushes['m'] = texSIG
        #create list
        self.lst = QtGui.QListWidget(self)
        self.lst.setStyleSheet( """
                                QListWidget:item:selected:active {
                                     background-color:red;
                                }
                                """
                                )
        #comment on styling:
        #background-color on selection is plain red
        #something like "selection-color: solid rgba(255, 0, 0, 50%);" shows no effect

        self.lst.setSortingEnabled(False)
        for idx, d in layers.items():
            newItem = QtGui.QListWidgetItem('{:s}'.format(d[0]))
            newItem.setBackground(QtGui.QBrush( brushes[d[1]] ))
            newItem.setTextAlignment(QtCore.Qt.AlignVCenter)
            self.lst.addItem(newItem)
        self.lst.setSelectionMode(QtGui.QAbstractItemView.SelectionMode(QtGui.QAbstractItemView.ExtendedSelection))
        self.lst.setDragDropMode(self.lst.InternalMove)
        #setup and show window
        self.setMinimumWidth(200)
        self.setMinimumHeight(200)
        self.show()
#create gui
app = QtGui.QApplication(sys.argv)
#create and display main window
main = MainWindow()
main.show()
#return exit code
sys.exit(app.exec_())

0 个答案:

没有答案