QTableWidget mit sehr vielen Zeilen

Alles rund um die Programmierung mit Qt
Antworten
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

QTableWidget mit sehr vielen Zeilen

Beitrag 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?
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und wenn du eine QTableView und ein passendes Model verwendest...?
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Verwende mal das QStandardModel, befülle es und mach dann ein setModel für deine QTableView
karo
Beiträge: 4
Registriert: 1. Oktober 2008 01:30

Spalten erzeugen

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
karo
Beiträge: 4
Registriert: 1. Oktober 2008 01:30

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
Antworten