2017-12-19 17 views
0

항목을 선택할 때 다른 선택 색상을 사용하고 싶습니다. 그러나 QTableWidget::item:selected{ background-color: }은 선택한 항목이 하나 뿐인 경우에만 작동합니다. 그렇지 않으면 선택한 모든 항목의 선택 색상이 동일하게됩니다. 그래서 모든 항목을 개별 선택 색상으로 만들 수있는 방법이 있습니까? PyQt5에서 QTableWidget의 각 항목의 선택 색상을 설정하는 방법

enter image description here

enter image description here

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

여러 선택은 선택한 모든 항목에 색상을 적용합니다. 한 번 선택하면 왼쪽의 빨간 색을 원해.

+0

색상은 무엇에 달려 있습니까? – eyllanesc

+0

@eyllanesc'main'에 정의 된'color_list'. column = i 일 때, 그것의 선택 색깔은'color_list [i]'이어야한다. – user6456568

+0

당신이 내 질문을 이해하지 못했을 것, 당신이 2 행 3 열의 테이블을 가지고 있다고 말하면, 어떤 색이 될 것이고, 그것이 선택 될 때 각 세포는 무엇을 가져야 하는가? – eyllanesc

답변

1

많은 경우 제한이 있으므로이 경우 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()) 

완전한 예 나는 아래를 보여

,536,
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_()) 
+0

감사합니다. 너는 최고야! – user6456568

+0

나는 여전히 혼란스러워하고있다. 글꼴 색상은 선택한 후에 자동으로 흰색으로 바뀝니다. 이를 피하고 글꼴 색상을 변경하지 않는 방법은 무엇입니까? – user6456568