Qt: Widgets updaten
-
Jetzt wird mir dein Problem klar. Das ist gar kein Qt Fehler.
Du löscht nur die QLayoutItem Objekte. Die ganzen Widgets sind alle noch vorhanden und aktiv, aber aus dem Layout raus. Deshalb hängen die einfach nur noch rum.
Du musst natürlich auch die Widgets löschen:
delete child->widget(); delete child;
-
Ich hab trotzdem mal ne neue Qt runtergeladen
und siehe da es ist ein bisschen anders ... jetzt werden einfach wie du sagst einfach sämtliche Elemente auf dem Bildschirm 'vergessen' ... gibts denn nich irgendne Möglichkeit den Bereich kurz nach dem Löschen des Layouts einmal zu malern? Ich hab schon mit anzeige->repaint(); rumprobiert, aber das tuts einfach nicht ...
Mensch sowas kann doch nicht so schwer sein, das machen Programme doch öfteraber wenn ich das Widget anzeige einfach lösche, muss ichs doch neu zu mainlayout hinzufügen, oder? Und wenns korrekt sein soll vorher noch entfernen?
Franz
-
Du willst doch deine ganzen QLabels löschen? Das geht dann so wie ich es gesagt habe. Anzeige selbst wird dann nicht gelöscht oder das Layout darin. Nur die Widgets im Layout.
Also zumindest ist das die Lösung für dein minimales Program. Erkläre noch mal genau, warum das keine Lösung für dein Gesamtproblem ist. Und zeig ein minimales Program, das den Fehler zeigt.
-
Bevor ich wieder stundenlang in die falsche Richtung progge *g*
Liege ich dann mit der Taktik richtig, wenn ich mit mit
QObject::children () const
ne Liste zurückgeben lasse und dann jedes Element ähnlich wie bei den QLayoutItems-Objekten löschen lasse? Verschwinden dann die alten, verwaisten Schriftzüge?
Franz
-
Also ehrlich? Ich hab bislang nur die hälfte verstanden.
Ich würde das Problem "Löschen Widget" aber anders angehen und das funkt eigentlich auch immer.QPtrList<QLabel> list;
for (int i=0 bis 3)
{
QLabel* label = new Qlabel(....
list.append(label);
}//if (!list.isEmpty())
QLabel* l;
for ( l = list.first(); l; l = list.next() )
delete l;
or
delete list.current();
or
bool QPtrList::remove ()
Removes the current list item.
Returns TRUE if successful, i.e. if item is in the list; otherwise returns FALSE.
The removed item is deleted if auto-deletion is enabled.Bei sowas würde ich immer mir Pointerlisten arbeiten, die können furchtbar nützlich sein.
Gruss,
Buggykite
-
Naja, das wär ne Lösung wenns nur um QLabels geht ... was ich bräuchte wär im Prinzip nen QTabWidget ohne die Tableiste ... das kann doch nich so schwer sein, wenn ich ein paar QLabels hab, und ich auswählen will, welches 'oben' liegt!
-
nalpak01 schrieb:
Naja, das wär ne Lösung wenns nur um QLabels geht ... was ich bräuchte wär im Prinzip nen QTabWidget ohne die Tableiste ... das kann doch nich so schwer sein, wenn ich ein paar QLabels hab, und ich auswählen will, welches 'oben' liegt!
Ich sehe nicht, wo dein aktuelles Problem liegt. Für dein gepostetes Programm haben wir ja eine elegante Lösung gefunden. Du hast meiner Meinung nach hier zwei Möglichkeiten:
1. Du zweigst uns ein Beispielprogramm mit dem tatsächlichen Problem.
2. Du beschreibst das Problem so, dass es jeder (auch ich) versteht.
-
also:::
Ich will einen Editor für ein Umfragesystem bauen. Und da gibts verschiedene Module. Die werden im Programm links in einem QListWidget alle angezeigt. Man kann natürlich Module hinzufügen etc.
Und rechts ist das eigentliche Editorbereich, hier wird dann der Inhalt des jeweils angezeigen Moduls angezeigt. Man kann also zwischen den Modulen hin- und herwechseln. Dazu muss sich der Bereich rechts natürlich verändern.Im Moment hab ich das so gelöst, dass der Bereich rechts aus einem QTabWidget besteht. Da es aber zu viele Module sind und die Namen zu lang, würde die "Tableiste", die bei mir oben ist, weit über den Bildschirm hinaus reichen und man müsste sich ewig bis zum gewünschten Modul durchklicken. Also verwende ich das QListWidget links als eine Art 2. Navigation, beim Klicken auf ein Modul hier wird rechts automatisch die richtige Tabseite aufgerufen.
Das ganze System ist allerdings für den Benutzer ziemlich irreführend ... die (von mir schon deaktivierten) Elemente der Tableiste oben rechts müssten also irgendwie ganz weg ...
Ist das irgendwie mit vertretbaren Mitteln möglich? Oder müsste man dazu die QTabWidget-Klasse umschreiben? Die hat natürlich angenehme Vorteile eingebaut, wie das nach-unten-scrollen, wenn der Inhalt zu lang wird ...
Ich könnte mir vorstellen, dass man in einer Liste die Inhalte der rechten Seiten von den ganzen Modulen speichert und dann per Klick auf ein Element im QListWidget links das richtige Widget ins mainlayout einfügt, aber wie realisiere ich das "austauschen" der rechten Seite?
-
"Das ganze System ist allerdings für den Benutzer ziemlich irriführend."
Wenn du selb st schon so weit bist, dann solltest du NICHT über die Frage
"Tabwidget oder nicht" nachdenken, sondern erstmal völlig losgelöst von einer
möglichen Realisierung über eine vernünftige und für den Anwender einfach
zu bedienende Benutzeroberfläche nachdenken.
Mit "irgendwie" kommst du nicht weiter: du musst schon selbst wissen wie !
-
Hast du dir schon QStackedWidget angeschaut?
http://doc.trolltech.com/4.1/qstackedwidget.html