Dynamischer Maskeninhalt unter QT
-
Ich stelle die Frage in diesem Forum, da ich davon ausgehe, hier das meiste Knoffhoff in Sachen QT zu finden.
Folgendes Problem:
Im Konstruktor der Maske wird ein Frame mit Gridlayout mit 3 Spalten angelegt. Auf diesem werden zur Laufzeit der Maske auf jede Spalte jeweils ein Frame mit 1 Spalte und n Zeilen gelegt. Beim ersten Aufruf klappt auch alles wunderbar.Zur Laufzeit soll die Maske jetzt geändert werden. Dazu gehe ich wie folgt vor:
m_pUnit->getChildList().setAutoDelete (true); m_pUnit->getChildList().clear(); //Grit-Layout neu anlegen m_pUnit->setLayouter(GridLayout); m_pUnit->setGridLayoutCols(3); m_pUnit->setGridLayoutMargin(3); m_pUnit->setGridLayoutSpacing(5); m_pUnit->setMaximumWidth(1600); m_pUnit->setMinimumWidth(1024); m_pUnit->resize(1024,400) ; m_pUnit->setMinimumHeight(400); m_pUnit->setFrameShadow(Sunken); m_pUnit->setFrameShape(Box);
Bis auf die ersten zwei Zeilen handelt es sich um denselben Code, der auch bereits im Konstruktur ausgeführt wurde. Das Gridlayout wird neu angelegt, da dieses durch getChildList().clear ebenfalls gekillt wurde. Anschließend läuft derselbe Code ab, der schon beim ersten Aufbau ausgeführt wurde.
Effekt: eine leere Maske.
Alle angemeldeten Elemente (bis auf die Hauptframes, die neu in den Spalten angelegt wurden, sind auf unsichtbar gestellt. Warum?
Hat jemand eine Idee?
-
Wie wäre es mit einem kleinen lauffähigen Programm, das das Problem zeigt.
-
Sorry, aber leider keine Chance.
QT arbeitet hier innerhalb eines Client-/Server-Frameworks und nicht für sich allein. QT ist nochmals über einen Wrapper gemappt, der allerdings im Wesentlichen nur die Aufrufe weiterleitet. Eine Separierung eines kleinen Programmes ist da ohne dieses Framework leider nicht möglich.
-
Manfred Schmidtke schrieb:
Sorry, aber leider keine Chance.
QT arbeitet hier innerhalb eines Client-/Server-Frameworks und nicht für sich allein. QT ist nochmals über einen Wrapper gemappt, der allerdings im Wesentlichen nur die Aufrufe weiterleitet. Eine Separierung eines kleinen Programmes ist da ohne dieses Framework leider nicht möglich.
Es geht ja nur darum, wie du mit einer Maske hantierst. Da reichen ja zwei felder oder so.
-
Die Maske wird nicht mit dem QT-Designer sondern über das Framework erzeugt und kann ohne das Framework nicht laufen (hab auch noch nie mit dem QT-Designer gearbeitet). Ich kann es höchstens mit Bildern versuchen.
Das Problem hat sich jetzt auch ein bisschen verschoben. Es liegt nicht an der Sichtbarkeit der Elemente. Die einzelnen Eingabegruppen werden in Groupboxen angelegt, in welchem ein Frame eingebunden ist. Dabei habe ich show() nur auf das Frame und nicht auf die Groupbox angewendet. Fragt sich nur, warum es beim ersten Aufruf trotzdem funktioniert.
Da beim zweiten Aufruf alle Eingabegruppen als unsichtbar gekennzeichnet waren, ging ich zunächst davon aus, das es QT egal ist an welcher Position er die Elemente nicht anzeigt.
Das Problem ist das Layout-Management. Alle Groupboxen werden an der Position 0,0 angezeigt! Nur das vorletzte
Element liegt über allen Elementen und ist teilweise sichtbar.
Er scheint dabei das Gritlayout völlig zu ignorieren, da die einzige sichtbare Groupbox das Elternelement überlagert und NICHT dort eingebettet ist. (Kann ich über ein kleines Hilfsprogramm feststellen, mit welchem die einzelnen Elemente ausgewählt und markiert werden können. Die childlist ist dabei völlig korrekt.
Da Programm nicht geht, versuch ich es einfach mal mit Bildern:
Darstellung dynamischer Teil der Maske beim ersten Aufruf: http://www.cfs.de/download/hc/bild1.png
Über das Hilfsprogramm werden mit die Attribute wie folgt angegeben:http://www.cfs.de/download/hc/bild2.png
Dabei ist subUnit_ICFDyn der dynamische Teil der Maske.
Nach dem ersten Neuaufbau (noch mit identischem Inhalt) habe ich dann das Bild:
http://www.cfs.de/download/hc/bild3.pngDas Hilfsprogramm gibt das folgende aus: http://www.cfs.de/download/hc/bild4.png
Bereits die beiden neu angelegten Hauptcontainer EDITCOL0_PERSONEN und EDITCOL1_PERSONEN haben scheinbar keine Verbindung mehr zum GridLayout. Angezeigt wird (wohl wegen der zur Verfügung stehenden Größe von 101,31) nur ein Teil von PERSONEN_GRP.
Vom Programmablauf her ist bei beiden Aufrufen alles identisch. Es wird zunächst jedes einzelne Element erzeugt und angezeigt. Anschließend werden die Properties gesetzt. Das Ganze wird über eine Kommandoliste gesteuert, die von außen geliefert wird.
Der einzige Unterschied liegt darin, daß auf die Kindelemente der gefüllten Maske ein clear durchgeführt wird und das Gritlayout neu angelegt wird.
-
Ohne das Ding vor sich zu haben, ist es sehr schwer etwas Sinnvolles zu sagen.
Der Code, den du gezeigt hast, macht zumindest nichts wichtiges. Es setzt nur einige Parameter für m_pUnit. Du zeigst nicht, wie neue Elemente eingefügt werden und sonstiges.
-
Den reinen QT-Code zu extrahieren ist praktisch unmöglich. Ich fürchte, damit muss ich wohl allein fertigwerden. Die Ursache habe ich auch schon gefunden (denke ich). Es gibt kein getChildList in QT sondern nur children. Während die eine Liste leer ist, enthält die QT-Liste weiterhin das alte GridLayout. Wird ein neues angelegt, dann meckert das System korrekterweise (ein Blick in die Log-Datei hätte schon geholfen, aber da steht verdammt viel drin).
Ich danke für die Mühe und werde wohl weiter debuggen müssen. Der Fehler liegt offensichtlich im Framework und nicht in QT.