2011-01-12 9 views
0

Ich verwende Qt, um ein sortierbares Balkendiagramm-ähnliches Widget zu erstellen. Das Widget wird mit einem QHBoxLayout für jeden Balken im Diagramm (die auch Widgets sind) ausgelegt.Sortierbare QHBoxLayout

Wenn der Benutzer die Sortierparameter ändert, löscht mein Controller das Layout, sortiert es und ruft addWidget für jedes Element der Reihe nach auf. Das Problem, mit dem ich konfrontiert bin, ist, dass diese Liste ziemlich groß ist (mehr als 1000 Widgets), und Qt kriecht, wenn man versucht, so viele Elemente zu gestalten.

Ich habe herausgefunden, dass jedes Mal, wenn addWidget aufgerufen wird, Qt den Speicherort jedes Elements in der QHBoxLayout neu berechnen und dann aktualisieren wird. Dies ist ein Problem, da es viele unnötige Berechnungen für jedes LayoutItem vor demjenigen ausführt, das ich hinzufüge. Für 1000 Testobjekte, die ich einsetze, dauert das Umsortieren ungefähr 30 Sekunden, was natürlich viel zu lang ist.

Gibt es einen besseren Layout-Typ oder gibt es eine schnellere Möglichkeit, eine Sammlung sortierter Widgets zu einem Layout hinzuzufügen?

Edit: Offenbar ist das Problem, das ich habe nicht mit Qt jedes Element wieder zu legen, aber die Interna aller Eltern und Spielereien, die hinter den Kulissen gehen ich ein Testprojekt einrichten hinzufügen 1000 Knöpfe zu einem Layout, jedesmal einen Zähler auszudrucken. Die Zahlen wurden fast sofort ausgedruckt, obwohl es ~ 30 Sekunden dauerte, bis sich Qt wieder aufrichtete. Ich denke, das Problem existiert nicht nur mit QHBoxLayout, sondern mit Qt's Layoutsystem im Allgemeinen. Sieht so aus, als würde ich Widgets manuell positionieren und ein QLayout ganz umgehen. Danke an alle, die ihren Beitrag geleistet haben.

Antwort

2

Von documenation von void QLayout::setEnabled(bool enable)

Aktiviert dieses Layout aktivieren, wenn wahr ist, deaktiviert es anders.
Ein aktiviertes Layout passt sich dynamisch an Änderungen an; ein deaktiviertes Layout verhält sich so, als wäre es nicht nicht vorhanden.
Standardmäßig sind alle Layouts aktiviert.

+0

Ich akzeptiere das, da das Testen mir half herauszufinden, dass das Problem in QLayout inhärent war und nicht nur QHBoxLayout. Danke, @ Piotr! –

0

Was ist ein Graph Widget machen (bestehend aus Bar (oder einen beliebigen Namen wählen) Widgets), die eigene QLayout Unterklasse optimiert für diese Aufgabe enthalten würde (da Sie reimplementieren QLayout::addItem() haben, die in QLayout rein virtuell).

Überprüfen Sie auch Qwt, da es bereits implementiert haben könnte was Sie wollen.

+0

Wir haben uns vorher mit qwt befasst, aber aufgrund von Lizenzproblemen in meiner Firma haben wir uns entschieden, es nicht in Projekten zu verwenden. Das Schreiben eines benutzerdefinierten QLayout ist mein derzeitiger Plan, aber da QHBoxLayout es bereits so auslegt, wie ich es möchte, würde ich es lieber verwenden (oder es unterklassifizieren), als das Rad neu zu erfinden. Es scheint, als wäre das ein häufiges Problem, aber vielleicht irre ich das. –

+0

@Dave McClelland Ich fürchte, Sie werden nicht in der Lage sein, das "unnötige Berechnungen" -Problem loszuwerden, das Sie für QHBoxLayout mit der bloßen Unterklasse von QHBoxLayout beschrieben haben, da das addItem() nicht virtuell ist. Sie können sich jedoch durch den addItem() - Code für QHBoxLayout "inspirieren" lassen und den "unnötigen Berechnungen" -Teil einfach loswerden :) – Palmik

0

Vielleicht können Sie ein neues QHBoxLayout ohne Eltern erstellen, fügen Sie Ihre Widgets zu diesem Layout und dann die alte QHBoxLayout löschen und Ihr neues Layout einfügen. WARNUNG: Ich habe das nicht versucht.