PyQt5中如何设置QTableWidget的每一项的选择颜色
How to set each item's selection color of QTableWidget in PyQt5
我希望在选择项目时有不同的选择颜色。但是 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_())
一个选择效果不错。
多选只是将颜色应用到所有选中的项目。我希望左边的选择后是红色的。
在这种情况下使用qss是不合适的,因为它们有很多限制,实现一个委托是合适的,在这种情况下是一个继承自QStyledItemDelegate的class。但在此之前我们必须通过QTableWidgetItem的setData方法保存颜色信息:
it = QTableWidgetItem("some_text")
it.setData(Qt.UserRole, some_color)
然后覆盖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)
则委托成立:
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_())
我希望在选择项目时有不同的选择颜色。但是 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_())
一个选择效果不错。
多选只是将颜色应用到所有选中的项目。我希望左边的选择后是红色的。
在这种情况下使用qss是不合适的,因为它们有很多限制,实现一个委托是合适的,在这种情况下是一个继承自QStyledItemDelegate的class。但在此之前我们必须通过QTableWidgetItem的setData方法保存颜色信息:
it = QTableWidgetItem("some_text")
it.setData(Qt.UserRole, some_color)
然后覆盖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)
则委托成立:
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_())