2016-04-27 23 views
0

Ich habe eine QTableWidget mit QTableWidgetItems bestückt und ich möchte die Hintergrundfarbe für einen Bereich von Zellen ändern (Zeile n ... m, alle Spalten). Iterieren über Zeilen/Spalten und Ändern der BG-Farbe für jede QTableWidgetItem mittels etw. wiePyQt, ändern QTableWidgetItem Hintergrundfarbe in einem Bereich von Zellen

for n in range(startRow, endRow): 
    for c in range(self.tableWidget.columnCount()): 
    self.tableWidget.item(n,c).setBackgroundColor(self.tableBackgroundColor) 

ist sehr langsam (etwa 4 ms pro Artikel auf einem Intel i7, die 4 sec ist. pro 25 * 40 Zellen).

Gibt es einen leistungsfähigeren Weg, dies zu erreichen?

Antwort

1

Ja, durch Umschalten auf einen Modell/Ansicht-Ansatz. Verwenden Sie statt QTableWidget einen QTableView und QTableModel. Dieser Ansatz ist schneller, da die Hintergrundfarbe nur für die (etwa hundert) sichtbaren Zellen anstatt für alle tausend Zellen berechnet wird.

Die Verwendung des Model/View-Ansatzes erfordert einige Investitionen, aber für größere Tabellen lohnt es sich.

Die Konzepte werden in the Qt docs erklärt. Es gibt auch eine tutorial. Sie haben beide C++ Code Schnipsel , aber es ist nicht so schwer zu PyQt zu übersetzen (eigentlich, siehe meinen Kommentar unten).

+1

Auf den zweiten Gedanken, kann die Übersetzung der C++ - Snippets einige Feinheiten enthalten. Ich empfehle, die Beispiele zu verwenden, die mit der PyQt-Quelle geliefert werden. Download der Quelldistributionen für [PyQt 4] (https://www.riverbankcomputing.com/software/pyqt/download) oder [PyQt 5] (https://www.riverbankcomputing.com/software/pyqt/download5) und Sieh dir die ItemView-Beispiele an, zum Beispiel 'itemviews/spinboxdelegate.py' – titusjan