QTableview中单元格的背景色,PySide2

2024-04-28 09:03:40 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用PySide2有条件地更改QTableView中项目的背景色? 我读了很多关于model view framework的文章。我不知道是否有必要使用委托。最近我可以在没有委托的情况下得到一列复选框。我相信虚拟方法setItemData(index, roles)和{}可能就是我需要的。但是,PySide2中没有QMap。我的模型必须在某个地方存储要由QtCore.Qt.BackgroundRole使用的额外信息(顺便说一句,那个枚举表示“用于用默认委托呈现的项目的背景笔刷”),如果我不指定委托,是否使用了“默认委托”?。我应该改为使用QStandardItemModel? 在下面的示例代码中,我如何根据一些阈值将特定列的背景色设置为红色(min和max列是阈值?在

from PySide2.QtWidgets import (QWidget, QApplication, QTableView,QVBoxLayout)
import sys
from PandasModel2 import  PandasModel2
import numpy as np
import pandas as pd
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 700, 300)
        self.setWindowTitle("QTableView")
        self.initData()
        self.initUI()

    def initData(self):

        data = pd.DataFrame(np.random.randint(1,10,size=(6,4)), columns=['Test#','MIN', 'MAX','MEASURED'])
        data['Test#'] = [1,2,3,4,5,6]                    
        #add the checkable column to the DataFrame
        data['Check'] = True
        self.model = PandasModel2(data)

    def initUI(self):
        self.tv = QTableView(self)
        self.tv.setModel(self.model)
        vbox = QVBoxLayout()
        vbox.addWidget(self.tv) 
        self.setLayout(vbox)  

app = QApplication([])
ex = Example()
ex.show()
sys.exit(app.exec_())

我有一个使用熊猫数据帧的定制模型:

^{pr2}$

Tags: 项目模型importselfdatamodeldef阈值
1条回答
网友
1楼 · 发布于 2024-04-28 09:03:40

默认情况下,委托使用BackgroundRole信息(如果可用),因此解决方案只是返回QColor、QBrush或类似的信息。在

from PySide2 import QtCore, QtGui

class PandasModel2(QtCore.QAbstractTableModel):
    # ...
    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid():
            return
        if not (0 <= index.row() < self.rowCount() and 0 <= index.column() <= self.columnCount()):
            return
        value = self._data.iloc[index.row(), index.column()]
        if role == QtCore.Qt.DisplayRole:
            if index.column() != 4: 
                if index.column() in [1,2,3]:
                    return '{:.3f}'.format(value)    
                if index.column() == 0:
                    return '{:.2f}'.format(value)
                return str(value)
        elif role == QtCore.Qt.CheckStateRole:  
            if index.column() == 4:
                return QtCore.Qt.Checked if value else QtCore.Qt.Unchecked
        elif index.column() == self.getColumnNumber('MEASURED'):
            if role == QtCore.Qt.BackgroundRole:
                if self.getMinimum(index.row()) <= value <= self.getMaximum(index.row()):
                    return QtGui.QColor("red")

相关问题 更多 >