我对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_())
我知道您正在使用
threading.Timer()
,因为加载和处理数据帧的过程非常耗时,并且您希望执行定期任务(如果任务不消耗太多时间,那么另一种选择是使用QTimer
)但问题是,您正在创建一个模型,并添加另一个线程中的GUI部分信息,这是Qt禁止的,如the docs所示考虑到上述情况,最好通过信号将次线程的信息发送到主线程,我还实现了一种方法,可以重置模型的信息,避免创建新的模型,最后我添加了验证代码,这样代码就不会失败
如您所见,我为测试随机创建了数据帧,但如果您想使用代码,则必须按如下方式替换它:
相关问题 更多 >
编程相关推荐