Seite 1 von 1

QTableWidget mit sehr vielen Zeilen

Verfasst: 29. September 2008 17:07
von Cartman
Ich habe ein QTableWidget mit 3 Spalten und mit sehr vielen Zeilen, bis 600 an der Zahl.

Beim Befüllen mit knapp 600 Zeilen braucht mein Programm ca. 74.464 msec (d. h. 74 Sekunden) -- ganz schön lang bei einem Dual-Core-Prozzi. Zum Befüllen muß leider für jede gewünschte Zeile ein neues QTableWidgetItem allokiert werden:

Code: Alles auswählen

QTableWidgetItem* item1 = new QTableWidgetItem(irgendwasString);
dbTableWidget->setItem(row,0,item1);
QTableWidgetItem* item2 = new QTableWidgetItem(egalString);
dbTableWidget->setItem(row,1,item2);
QTableWidgetItem* item3 = new QTableWidgetItem(sonstwoString);
dbTableWidget->setItem(row,2,item3);
Auto-Sortieren ist für die Zeit des Befüllens bereits deaktiviert.

Ist QTableWidget hier einfach überfordert oder kann ich da noch was machen?

Verfasst: 29. September 2008 17:57
von Cartman
Ich habe mittlerweils etwas gefunden:

Code: Alles auswählen

QObject::blockSignals
Bevor ich anfange, die Tabelle zu füllen, setze ich sie auf "blockSignals". Somit löst nicht jede Zeile eine (graphische) Aktualisierung aus. Anschließend hebe ich die Blockade wieder auf. Fazit: ca. 15 statt 74.000 msec.

Hoffe, daß die Lösung so ok ist.

Verfasst: 29. September 2008 19:06
von upsala
Und wenn du eine QTableView und ein passendes Model verwendest...?

Verfasst: 30. September 2008 09:10
von Cartman
upsala hat geschrieben:Und wenn du eine QTableView und ein passendes Model verwendest...?
Ich habe mal statt der overhead-trächtigen QTableWidget-Covenience-Funktionen mal direkt mit dem Model eingefügt (d. h. QAbstractItemModel::insertRow). War kaum schneller als zuvor. Auch hier wird bei jedem insertRow ein Haufen Signale getriggert. Das Blockieren von Signalen verwende ich beim Einfügen direkt am Model.

Ein eigenes Model sollte keine Vorteile gegenüber dem Default-Model geben. QTableWidget ist ein QTableView mit einem Model (Default-Model halt). Nur hat es eben ganz oben in der Vererbung ein paar vereinfachende Funktionen.

Verfasst: 30. September 2008 18:44
von upsala
Verwende mal das QStandardModel, befülle es und mach dann ein setModel für deine QTableView

Spalten erzeugen

Verfasst: 1. Oktober 2008 19:23
von karo
Hey Leute,
ich habe ein Problem Spalten beim TableWidget zu erzeugen. Ich kann den project build ausfuehren und der run laeuft auch, aber ich erhalte weder ein widget mit Spalten oder Zeilen...

Kann mir jemand ein Beispiel geben oder zumindest sagen (einen Link schicken), wo ich eines finden kann, wie man eine einfache Tabelle oder einfach nur ein textEdit mit 2 Spalten (wenn das denn moeglich ist) oder so erzeugen kann....

Ich danke jetzt schonmal fuer eure Hilfe, bye

Verfasst: 1. Oktober 2008 19:32
von upsala
Warum fängst du nicht einen neuen Thread an?

Code: Alles auswählen

(new QTableWidget(10, 3))->show();
Das reicht bereits aus, um ein einfache leere Tabelle darzustellen... Desweiteren würde ich die Model/View-Doku mal durchzulesen...

Verfasst: 1. Oktober 2008 19:42
von karo
Das ging ja schnell...ich bin ueberrascht. Ich dachte mir, dass mein Thema hier passt. Deshalb habe ich kein neues Thread aufgemacht.
Es funktioniert, aber das ist eigentlich nicht das, was ich mir erwuenscht habe. Ich wollte die Tabelle, die ja auch eigentlich keine richtige Tabelle sein soll, sondern eher eine Status and Settings Anzeige darstellen soll, in meinem mainWidget darstellen.
Hast du eine Idee? Wo finde ich dieses Model/View-Doku, das du erwaehnt hast?

Verfasst: 1. Oktober 2008 20:28
von upsala
Du wolltest eine Tabelle und doch wieder keine...

Entscheide dich mal was du willst, überflieg mal die Qt-Doku und dann schaun wir weiter...

Verfasst: 2. Oktober 2008 09:29
von Cartman
upsala hat geschrieben:Verwende mal das QStandardModel, befülle es und mach dann ein setModel für deine QTableView
Denke mal, das ist besser, als die Signale zu blockieren. Solange ein Modell nicht irgendwo eingesetzt ist, kann man ohne dazuwischenfunkende Signale auch gerne tausende Elemente Einfügen (4000 sind bestätigt). Danke.
karo hat geschrieben:Kann mir jemand ein Beispiel geben
Schau mal in den Qt-Unterordner "examples/itemviews/". Da sind diverse (einfache) Beispiele, mit Spalten, mit editierbaren Zellen, mit Baumansicht, etc. Einfach ausführen und angucken, ob es das ist, was man haben möchte.