我从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)
我能够让代码像我想要的那样工作,我将它粘贴到下面。我相信有一种更干净、更“pythonic”的方式来实现它,但它是有效的
至于是什么不同使它起作用,我不太清楚。我确实为列索引实现了一个变量,以帮助我了解发生了什么,我删除了column count if语句,但除此之外,我不确定
下面是我的工作代码,希望将来能对其他人有所帮助
相关问题 更多 >
编程相关推荐