2017-05-21 168 views
1

Python(3+)和Qt(5)(儘管很高興有Py2.7和Qt4的答案!)。 完全混淆了關於樣式,代表,模型和其他一切的大量文檔。PyQt Tableview基於單元值的行背景顏色

我發現設置交替行的背景很簡單,但我想爲一列與特定值匹配的行設置背景(即Archive == True)。

備用行:

self.plainModel = QSqlQueryModel() 
self.create_model() 
self.linksTable.setModel(self.plainModel) 
self.linksTable.setAlternatingRowColors(True) 
self.linksTable.setStyleSheet("alternate-background-color: Lightgrey;background-color: white;") 
self.linksTable.resizeColumnsToContents() 

我見過展示如何做到這一點through the model一個例子,但這個具體的例子似乎被簡單地複製交替行的結果,過了幾天盯着代碼,我可以如何將其翻譯爲檢查存檔列。從example

提取物:

elif role == Qt.BackgroundRole: 
    if index.row() % 2 == 0: 
     return QBrush(Qt.yellow) 
elif role != Qt.DisplayRole: 
    return QVariant() 

,我發現了另一個example using delegates但不能在此刻讓我的頭周圍。

特別是我仍然無法理解你將如何選擇哪些行得到改變,並且無法理解如何將簡單的背景色應用爲「選項」! (閱讀QStyleOptionViewItem的文檔正在發送我的兔子洞!)。

你能幫忙嗎?

回答

2

我們必須獲取存檔列中的數據(在我的示例中是第三個數據)並驗證它是否滿足條件(在這種情況下爲true),如果是這樣,我們返回QBrush對象所需的顏色。

def data(self, item, role): 
    if role == Qt.BackgroundRole: 
     if QSqlQueryModel.data(self, self.index(item.row(), 3), Qt.DisplayRole): 
      return QBrush(Qt.yellow) 
    return QSqlQueryModel.data(self, item, role) 

另外,在我的情況下使用的數據庫SQLITE那裏沒有布爾數據,但在限制爲值0或1的數據類型爲int仿真,所以使用下面的指令,其中,它返回真或根據假1或0,分別。

def data(self, item, role): 
    [...] 
    if role == Qt.DisplayRole: 
     if item.column() == 3: 
      return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 1 else False 
    return QSqlQueryModel.data(self, item, role) 

總之使用下面的代碼中,除了完整的代碼是here

def data(self, item, role): 
    if role == Qt.BackgroundRole: 
     if QSqlQueryModel.data(self, self.index(item.row(), 3), Qt.DisplayRole): 
      return QBrush(Qt.yellow) 
    if role == Qt.DisplayRole: 
     if item.column() == 3: 
      return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 1 else False 
    return QSqlQueryModel.data(self, item, role) 

截圖:

enter image description here

+0

完美 - 我添加了一個後續問題如果你有興趣。我沒有把它作爲一個討論,因爲你已經完全回答了這個問題。 https://stackoverflow.com/questions/44121172/pyqt-tableview-background-color-based-on-text-value-rather-than-true-or-false – Alan