为单个单元格设置ForegroundRole的格式

2024-09-27 00:13:43 发布

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

我从QTableView refresh获得了大部分代码

我从SQL数据库中提取数据,并通过Pandas DataFrame将其呈现给QabStretctTableModel,然后用QTableView显示它。一切正常(感谢上述文章的大力帮助)。现在的问题是,我只想给第二列中的文本上色,这是我在数据函数中的颜色决策中使用的同一列

我已经调试了代码,以查看“it”变量中的值只是我想要着色的值,因此在我看来,当应用“return qtg.QBrush(qtc.QT.color)”时,它将只对数据着色,而对整行着色

如果您能帮助理解这段代码是如何工作的,我们将不胜感激

import sys
import threading

import pandas as pd

from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
from PyQt5 import QtWidgets as qtw

import data
import pyodbc


class PandasManager(qtc.QObject):
    dataFrameChanged = qtc.pyqtSignal(pd.DataFrame)

    def start(self):
        self.t = threading.Timer(0, self.load)
        self.t.start()

    def load(self):
        df = data.get_data()

        self.dataFrameChanged.emit(df)
        self.t = threading.Timer(5.0, self.load)
        self.t.start()

    def stop(self):
        self.t.cancel()


class PandasModel(qtc.QAbstractTableModel):
    def __init__(self, df=pd.DataFrame()):
        qtc.QAbstractTableModel.__init__(self)
        self._df = df

    @qtc.pyqtSlot(pd.DataFrame)
    def setDataFrame(self, df):
        self.beginResetModel()
        self._df = df
        self.endResetModel()

    def rowCount(self, parent=None):
        return self._df.shape[0]

    def columnCount(self, parent=None):
        return self._df.shape[1]

    def data(self, index, role=qtc.Qt.DisplayRole):
        if index.isValid():  #Checking the validity of the index
            if role == qtc.Qt.ForegroundRole: # The role for text color
                if self.columnCount() >= 3 : # checking the number of columns is greater than 3 (Should be 5)
                    it = self._df.iloc[index.row(), 1] # Finds the specific data (second column) to test and assigns it to the variable "it"
                    if it == "WE": # If the value matches
                        return qtg.QBrush(qtc.Qt.yellow) #Color -- I may not quite understand what this is actually doing
                    if it == "UMaint": # Another value to match
                        return qtg.QBrush(qtc.Qt.green) # Another color
            if role == qtc.Qt.DisplayRole: # If not ForegroundRole but is DisplayRole
                return str(self._df.iloc[index.row(), index.column()]) #Set value

    def headerData(self, col, orientation, role):
        if orientation == qtc.Qt.Horizontal and role == qtc.Qt.DisplayRole:
            return self._df.columns[col]
        return None


if __name__ == "__main__":
    app = qtw.QApplication(sys.argv)
    w = qtw.QTableView()
    model = PandasModel()
    w.setModel(model)
    w.show()

    manager = PandasManager()
    manager.dataFrameChanged.connect(model.setDataFrame)
    manager.start()

    ret = app.exec_()

    manager.stop()

    sys.exit(ret)

Tags: theimportselfdataframedfdataindexreturn
1条回答
网友
1楼 · 发布于 2024-09-27 00:13:43

我能够让代码像我想要的那样工作,我将它粘贴到下面。我相信有一种更干净、更“pythonic”的方式来实现它,但它是有效的

至于是什么不同使它起作用,我不太清楚。我确实为列索引实现了一个变量,以帮助我了解发生了什么,我删除了column count if语句,但除此之外,我不确定

下面是我的工作代码,希望将来能对其他人有所帮助

def data(self, index, role=QtCore.Qt.DisplayRole):

        current_column = index.column()
        current_row = index.row()

        we_color = QtGui.QColor('#FF9900')
        wp_color = QtGui.QColor('#CCCC33')
        umaint_color = QtGui.QColor('#FF0000')
        smaint_color = QtGui.QColor('#FA8072')
        equipinstall_color = QtGui.QColor('#0066FF')
        upartwt_color = QtGui.QColor('#990099')
        le_color = QtGui.QColor('#CC6600')
        prodrun_color = QtGui.QColor('#00FF00')
        matlassist_color = QtGui.QColor('#CC9999')
        oqual_color = QtGui.QColor('#C993FF')
        equipeng_color = QtGui.QColor('#B22222')

        white_color = QtGui.QColor(QtCore.Qt.white)
        black_color = QtGui.QColor(QtCore.Qt.black)

        if index.isValid():  # Checking the validity of the index
            if role == QtCore.Qt.ForegroundRole:  # The role for text color
                if current_column == 1:  # checking the number of columns is greater than 3 (Should be 5)
                    it = self._dataframe.iloc[index.row(), current_column]  # Finds the specific data (second column) to test and assigns it to the variable "it"
                    if it == "WE":  # If the value matches
                        return QtGui.QBrush(black_color)  # Color   I may not quite understand what this is actually doing
                    if it == "WP":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "SMaint":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "UMaint":  # Another value to match
                        return QtGui.QBrush(white_color)  # Another color+
                    if it == "EquipInstall":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "UPartWt":  # Another value to match
                        return QtGui.QBrush(white_color)  # Another color+
                    if it == "LE":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "ProdRun":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "MatlAssist":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "OQual":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+
                    if it == "EquipEng":  # Another value to match
                        return QtGui.QBrush(black_color)  # Another color+

            if role == QtCore.Qt.BackgroundColorRole:  # The role for text color
                if current_column == 1:
                    it = self._dataframe.iloc[index.row(), current_column]  # Finds the specific data (second column) to test and assigns it to the variable "it"
                    if it == "WE":  # If the value matches
                        return QtGui.QBrush(we_color)  # Color   I may not quite understand what this is actually doing
                    if it == "WP":  # Another value to match
                        return QtGui.QBrush(wp_color)  # Another color+
                    if it == "SMaint":  # Another value to match
                        return QtGui.QBrush(smaint_color)  # Another color+
                    if it == "UMaint":  # Another value to match
                        return QtGui.QBrush(umaint_color)  # Another color+
                    if it == "EquipInstall":  # Another value to match
                        return QtGui.QBrush(equipinstall_color)  # Another color+
                    if it == "UPartWt":  # Another value to match
                        return QtGui.QBrush(upartwt_color)  # Another color+
                    if it == "LE":  # Another value to match
                        return QtGui.QBrush(le_color)  # Another color+
                    if it == "ProdRun":  # Another value to match
                        return QtGui.QBrush(prodrun_color)  # Another color+
                    if it == "MatlAssist":  # Another value to match
                        return QtGui.QBrush(matlassist_color)  # Another color+
                    if it == "OQual":  # Another value to match
                        return QtGui.QBrush(oqual_color)  # Another color+
                    if it == "EquipEng":  # Another value to match
                        return QtGui.QBrush(equipeng_color)  # Another color+

            if role == QtCore.Qt.DisplayRole:  # If not ForegroundRole but is DisplayRole
                return str(self._dataframe.iloc[index.row(), index.column()])  # Set value

相关问题 更多 >

    热门问题