在Pyqt / PySide中如何在TableView的单元格中设置不同的颜色

时间:2013-05-06 07:58:22

标签: python qt pyqt pyside

我从数据库中获取数据并在TableView上显示它。

在一个单元格中,某些关键字对于用户来说应该更加明显,例如警告关键等等。

我知道如何更改整个单元格的字体颜色,但我们只需要更改其中的一些字体颜色。

e.g。

警告:您的试用期只剩下 20

警告的字样和数字20应该是红色,其他字应该是正常的黑色。

怎么样? 非常感谢你。

3 个答案:

答案 0 :(得分:3)

您需要为表格视图使用model,这会为角色ForegroundRole的某些单元格返回红色前景色。类似的东西:

class MyModel(QtCore.QAbstractTableModel):

    def data(self, index, role):
        if index.isValid():
            if role == QtCore.Qt.ForegroundRole and condition_for_red_color:
                return QtGui.QBrush(...)

答案 1 :(得分:0)

我认为你需要使用委托来实现你想要的 - 标准视图不支持那种文本格式化。

委托可以按照您想要的方式绘制单元格。它并不像你想象的那么难,但它需要你创建一个以两种颜色写入文本的绘制方法。理想情况下,您希望它支持所有常规样式,因此将其作为QStyledItemDelegate的子类。以下是一些很好的例子,涵盖了你需要的一切:

How to make item view render rich (html) text in Qt

遗憾的是,QStyledItemDelegate.initStyleOption的PySide实施中存在一个错误:

https://bugreports.qt-project.org/browse/PYSIDE-115

这可能会使风格完全正确。但是红色文本应该是可行的。

答案 2 :(得分:0)

万一有人来这里如何将负数变成红色,warvariuc的答案就被钉在了这里。这是pyqt代码,如果有帮助的话(应该将任何负数设为红色,其他所有值,包括字符串或非数字,设为黑色):

class PandasModel(QtCore.QAbstractTableModel):    
    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data
    def data(self, index, role):
        if index.isValid():
            if role == QtCore.Qt.ForegroundRole:
                try:
                    if np.float(index.data()) < 0:
                         return QtGui.QBrush(QtCore.Qt.red)
                    else:
                         return QtGui.QBrush(QtCore.Qt.black)
                except:
                    return QtGui.QBrush(QtCore.Qt.black)