2013-04-11 1 views
1

У меня есть табличный вид, в котором каждая ячейка имеет собственный цвет текста. Когда строка выбрана, цвет изменяется на значение по умолчанию, указанное по умолчанию (белый). Как я могу сохранить заданный цвет ForegroundRole, когда строка также выбрана? Спасибо за вашу помощь.PyQT: переопределить выделенный цвет текста в TableView

ответ

1

Возможно, вы можете использовать пользовательский делегат для достижения этого.

Попробуйте это с подсказками от here.

from PyQt4 import QtGui, QtCore 
import sys 


class CustomSelectColorDelegate(QtGui.QStyledItemDelegate): 

    def __init__(self, parent = None): 
     super(CustomSelectColorDelegate, self).__init__(parent) 

    def paint(self, painter, option, index): 
     painter.save() 

     # set background color 
     if option.state & QtGui.QStyle.State_Selected: 
      painter.setBrush(QtGui.QBrush(QtCore.Qt.white)) 
     else: 
      painter.setBrush(QtGui.QBrush(QtCore.Qt.red)) 
     painter.drawRect(option.rect) 

     # set text color 
     if option.state & QtGui.QStyle.State_Selected: 
      painter.setPen(QtGui.QPen(QtCore.Qt.red)) 
     else: 
      painter.setPen(QtGui.QPen(QtCore.Qt.white)) 

     value = index.data(QtCore.Qt.DisplayRole) 
     if value.isValid(): 
      text = value.toString() 
      painter.drawText(option.rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignCenter, text) 

     painter.restore() 


if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    mw = QtGui.QWidget() 

    tableViewer0 = QtGui.QTableWidget() 

    newitem1 = QtGui.QTableWidgetItem('this is standard text') 
    newitem2 = QtGui.QTableWidgetItem('this is custom text') 

    tableViewer0.setColumnCount(2) 
    tableViewer0.insertRow(0) 
    tableViewer0.setItem(0, 0, newitem1) 
    tableViewer0.setItem(0, 1, newitem2) 

    customSelectColorDelegate = CustomSelectColorDelegate() 
    tableViewer0.setItemDelegateForColumn(1, customSelectColorDelegate) 


    vbox = QtGui.QVBoxLayout() 
    vbox.addWidget(tableViewer0) 
    mw.setLayout(vbox) 
    mw.show() 
    sys.exit(app.exec_()) 
+0

Спасибо, это должно сделать трюк. – user443850

Смежные вопросы