简体   繁体   English

如何在PyQt5中设置QTableWidget的每个项目的选择颜色

[英]How to set each item's selection color of QTableWidget in PyQt5

I'd like to have different selection color when an item is selected. 选择一个项目时,我想使用其他选择颜色。 But the QTableWidget::item:selected{ background-color: } only works when there is only one item selected, otherwise all selected items will have the same selection color. 但是QTableWidget::item:selected{ background-color: }仅在只有一个项目被选中时才起作用,否则所有选中的项目将具有相同的选择颜色。 So is there a way to make every item have individual selection color? 那么有没有一种方法可以使每个项目都有各自的选择颜色?

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.MainWindow=MainWindow
        self.MainWindow.resize(300, 100)
        self.centralwidget = QtWidgets.QWidget(self.MainWindow)
        self.MainWindow.setCentralWidget(self.centralwidget)
        """table """
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.insertRow(0)
        self.tableWidget.setColumnCount(2)

        self.tableWidget.setItem(0,0,QtWidgets.QTableWidgetItem("red"))
        self.tableWidget.setItem(0,1,QtWidgets.QTableWidgetItem("blue"))
        self.tableWidget.itemSelectionChanged.connect(self.ChangeSelectionColor)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def ChangeSelectionColor(self):
        try:
            for item in self.tableWidget.selectedItems():
                col=item.column()
            self.tableWidget.setStyleSheet("QTableWidget::item:selected{ background-color: %s }"%color_list[col])
        except UnboundLocalError:
            pass
if __name__ == "__main__":
    import sys
    color_list=['red','blue']
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

在此处输入图片说明

在此处输入图片说明

One selection works good. 一种选择效果很好。

在此处输入图片说明

Multiple selection just applies the color to all items selected. 多项选择仅将颜色应用于所有选中的项目。 I want the left one to be red once selected. 我希望左边的一个被选为红色。

Use qss in this case is not appropriate because they have many limitations, it is appropriate to implement a delegate, in this case a class that inherits from QStyledItemDelegate. 在这种情况下,使用qss是不合适的,因为它们有很多限制,它适合于实现委托,在这种情况下,该类是从QStyledItemDelegate继承的类。 But before that we must save the color information through the setData method of QTableWidgetItem: 但是在此之前,我们必须通过QTableWidgetItem的setData方法保存颜色信息:

it = QTableWidgetItem("some_text")
it.setData(Qt.UserRole, some_color)

Then the paint method of QStyledItemDelegate is overwritten and the selection color is changed: 然后,重写QStyledItemDelegate的paint方法,并更改选择颜色:

class ColorDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        color = index.data(Qt.UserRole)
        option.palette.setColor(QPalette.Highlight, color)
        QStyledItemDelegate.paint(self, painter, option, index)

Then the delegate is established: 然后建立委托:

your_qtablewidget.setItemDelegate(ColorDelegate())

A complete example I show it below: 我在下面显示了一个完整的示例:

from PyQt5.QtWidgets import QApplication, QStyledItemDelegate, QTableWidget, QTableWidgetItem, QStyle
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtCore import qrand, Qt

class ColorDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        color = index.data(Qt.UserRole)
        option.palette.setColor(QPalette.Highlight, color)
        QStyledItemDelegate.paint(self, painter, option, index)


def fun(n_rows, n_columns):
    return [[QColor(qrand() % 256, qrand() % 256, qrand() % 256) for i in range(n_rows)] for j in range(n_columns)]

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    n_rows, n_columns = 10, 10
    colors = fun(n_rows, n_columns)
    w = QTableWidget()
    w.setColumnCount(n_columns)
    w.setRowCount(n_columns)
    for i in range(w.rowCount()):
        for j in range(w.columnCount()):
            it = QTableWidgetItem("{}-{}".format(i, j))
            it.setData(Qt.UserRole, colors[i][j])
            w.setItem(i, j, it)
    w.setItemDelegate(ColorDelegate())
    w.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM