2017-05-21 5 views
1

Python (3+) und Qt (5) (obwohl glücklich, Py2.7 und Qt4 Antworten zu haben!). Völlig verwirrt durch umfangreiche Dokumentation über Stile, Delegierte, Modelle und alles andere.PyQt Tabellenansicht Zeile Hintergrundfarbe basierend auf Zellenwert

Ich habe es einfach gefunden, den Hintergrund von alternativen Zeilen zu setzen, aber ich möchte den Hintergrund für Zeilen festlegen, wo eine Spalte einen bestimmten Wert (d. H. Archive == True) entspricht.

Alternative Reihen:

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() 

Ich habe ein Beispiel zeigt, gesehen, wie es through the model zu tun, aber diese spezifische Beispiel scheint einfach zu sein, um die abwechselnden Reihen Ergebnis zu replizieren, und nach ein paar Tagen einen Code starrte ich kann nicht herausfinden, wie man das übersetzt, um die Archivspalte zu überprüfen.

Auszug aus example:

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

ich einem anderen example using delegates gefunden habe, kann aber zur Zeit nicht meinen Kopf um es bekommen.

Besonders kann ich immer noch nicht verstehen, wie Sie wählen würden, welche Zeilen die Änderung erhalten, und kann nicht verstehen, wie man eine einfache Hintergrundfarbe als "Option" anwendet! (Das Lesen der Dokumentation zu QStyleOptionViewItem schickt mich durch das Kaninchenloch!).

Können Sie helfen?

Antwort

2

Wir müssen die Daten im Archiv Spalte erhalten (in meinem Beispiel ist es die dritte) und stellen Sie sicher, dass sie die Bedingung erfüllt (in diesem Fall true), wenn dies der Fall geben wir das QBrush Objekt mit der gewünschten Farbe.

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) 

Auch in meinem Fall die Datenbank SQLite, wo es keine boolean Daten, sondern auf Werte eingeschränkt 0 oder 1 ist, so verwenden Sie die folgende Anweisung mit dem Datentyp int emulieren, wo es wahr oder falsch gemäß 1 zurückgibt oder 0, jeweils.

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) 

Kurz den folgenden Code, zusätzlich der vollständige Code ist 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) 

Screenshot:

enter image description here

+0

Perfect - Ich habe eine weitere Frage hinzugefügt wenn Sie interessiert sind. Ich habe es hier nicht als Diskussion aufgenommen, weil Sie diese Frage vollständig beantwortet haben. https://stackoverflow.com/questions/44121172/pyqt-tableview-background-color-based-on-text-value-rather-than-true-or-false – Alan

Verwandte Themen