我对QTableView有以下疑问,我添加了一些代码,这些代码根据数据框在最后一列中包含的字符串来更改行背景。
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.BackgroundRole:
if df.iloc[index.row(),5] == "Ready for QC":
return QBrush(Qt.yellow)
if df.iloc[index.row(),5] == "In Progress":
return QBrush(Qt.green)
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
当表格第一次加载正确绘制表格时,问题是我有一个特定部分的代码总是每 5 秒运行一次,以便用新信息刷新表格。
def printit():
threading.Timer(5.0, printit).start()
weekNumber = date.today().isocalendar()[1]
aux = pd.read_excel('PCS tasks 2020.xlsm',sheet_name='W'+str(weekNumber))
today = datetime.today()
df = aux[aux['Date Received'] == today.strftime("%Y-%d-%m")]
df = df[["Requestor","Subject","Task type","Created by","QC Executive","Status"]].fillna("")
df = df[df['Status'] != "Completed"]
model = pandasModel(df)
view.setModel(None)
view.setModel(model)
问题是,当上面的代码运行时,表格确实会更新数据,但不会改变颜色。我目前已经尝试过不同的方法,比如定义 setData 并在那里更新颜色但无济于事。现在我问你是否有人知道有关在 QTableView 上更新颜色的信息。
顺便说一句,我附上下面的 python 程序的整个代码以提供上下文。
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt
from PyQt5.QtGui import QBrush
from datetime import date, datetime
import threading
weekNumber = date.today().isocalendar()[1]
aux = pd.read_excel('PCS tasks 2020.xlsm',sheet_name='W'+str(weekNumber))
today = datetime.today()
df = aux[aux['Date Received'] == today.strftime("%Y-%d-%m")]
df = df[["Requestor","Subject","Task type","Created by","QC Executive","Status"]].fillna("")
df = df[df['Status'] != "Completed"]
def printit():
threading.Timer(5.0, printit).start()
weekNumber = date.today().isocalendar()[1]
aux = pd.read_excel('PCS tasks 2020.xlsm',sheet_name='W'+str(weekNumber))
today = datetime.today()
df = aux[aux['Date Received'] == today.strftime("%Y-%d-%m")]
df = df[["Requestor","Subject","Task type","Created by","QC Executive","Status"]].fillna("")
df = df[df['Status'] != "Completed"]
model = pandasModel(df)
view.setModel(None)
view.setModel(model)
class pandasModel(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1] -1
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.BackgroundRole:
if df.iloc[index.row(),5] == "Ready for QC":
return QBrush(Qt.yellow)
if df.iloc[index.row(),5] == "In Progress":
return QBrush(Qt.green)
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
if __name__ == '__main__':
app = QApplication(sys.argv)
model = pandasModel(df)
view = QTableView()
view.setModel(model)
view.resize(523, 300)
printit()
view.show()
sys.exit(app.exec_())