代码之家  ›  专栏  ›  技术社区  ›  user6456568

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

  •  2
  • user6456568  · 技术社区  · 8 年前

    我想在选择项目时使用不同的选择颜色。但是 QTableWidget::item:selected{ background-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_())
    

    enter image description here

    enter image description here

    一种选择效果很好。

    enter image description here

    多选仅将颜色应用于所有选定的项目。我希望左侧的一个在选中后变为红色。

    1 回复  |  直到 6 年前
        1
  •  5
  •   eyllanesc    8 年前

    在这种情况下使用qss是不合适的,因为它们有很多限制,所以实现委托是合适的,在这种情况下是从QStyledItemDelegate继承的类。但在此之前,我们必须通过QTableWidgetItem的setData方法保存颜色信息:

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

    然后是 QStyledItemDelegate 将被覆盖,并更改选择颜色:

    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)
    

    然后建立代表:

    your_qtablewidget.setItemDelegate(ColorDelegate())
    

    下面是一个完整的示例:

    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_())
    
    推荐文章