ich hab kürzlich anggefangen mich in PyQt einzuarbeiten. Nun bin ich auf folgendes Problem gestoßen:
Ich möchte eine größere Datenmenge (ca. 100.000 Elemente) in einer Liste oder Tabelle darstellen. In dem Moment wo die Daten in die Liste übernommen werden, friert allerdings alles ein. Eine Reaktion der Oberfläche setzt erst nach ca. 10s. wieder ein. Danach lässt sich wieder normal mit der Oberfläche arbeiten. Scrollen und verändern der Fenstergröße gehen ebenfalls flüssig. Das ListWiew scheint an sich keine Probleme mit der Datenmenge zu haben, wenn sie erstmal eingetragen wurde.
Um das Problem zu verdeutlichen habe ich folgende Zeilen geschrieben (leicht abgewandelt von hier (ich weiß, schlechte Namen, Sternchen, etc.)):
Code: Alles auswählen
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
# create table
list_data = list("ABCDEFG")
lm = MyListModel(list_data, self)
lv = QListView()
lv.setModel(lm)
# button
test_button = QPushButton("Test")
QObject.connect(test_button, SIGNAL("clicked()"), lm.fill_in_much_data)
# layout
layout = QVBoxLayout()
layout.addWidget(lv)
layout.addWidget(test_button)
self.setLayout(layout)
class MyListModel(QAbstractListModel):
def __init__(self, datain, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.listdata = datain
def rowCount(self, parent=QModelIndex()):
return len(self.listdata)
def data(self, index, role):
if index.isValid() and role == Qt.DisplayRole:
return QVariant(self.listdata[index.row()])
else:
return QVariant()
def fill_in_much_data(self):
self.listdata = range(100000)
self.reset()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
Ich hab es auch schon mit einem QListWidget probiert und die Elemente über addItem hinzugefügt. Die Schleife mit dem Hinzufügen der Elemente ist schnell (ca. 0.5) abgearbeitet. Danach friert die Oberfläche aber ebenso kurz ein.
MFG HerrHagen