Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Reihenfolge von Methodenaufrufen bei vererbten Klassen



axeljaeger
28-10-2002, 14:50
Ich habe mir eine Klasse geschrieben - MBase -, die sich ähnlich wie in Qt in Klassen organisiert.
Es gibt ein RootObject und jedes weitere Object, das von MBase erbt, hat in seinem Konstruktor
einen Pointer anzugeben. Der Sinn der Sache liegt darin, das ich alle Objekte auf einen Schlag
freigeben kann, weil im Desktruktor von MBase alle Unterobjekte gelöscht werden.

Soviel zur Vorgeschichte.

Das ganze soll nun in einem Widgetset genutzt werden. Wenn ich ein Objekt von MBase oder von
MBase geerbten Klassen erzeuge, bekommt das ParentObject ein childEvent(), mit dem man merkt,
dass ein neues ChildObject eingefügt wurde. Das würde ich gerne nutzen, um das Layout des
ParentWidgets neu zu berechnen. Das funktioniert aber nicht, weil das Layout erst neu berechnet
werden kann, wenn der Konstruktor der Klasse, die von MBase erbt aufgerufen wurde, weil
erst dort Sachen, wie etwa die minimale Größe eingestellt werden.


class MWidget : public MBase
{
public:
MWidget(MBase* parent, TString name) : MBase(MBase* parent, TString name)
{

}
}

Also parent bekommt von Konstruktor von MBase des childs, in diesem Fall MWidgeg, ein childEvent(), aber bevor
der Konstruktor von MWidget aufgerufen wurde. Ich aber brauche ein childEvent() NACHDEM
MWidget fertig kontruiert ist. Ich will aber dem Anwender nicht zumuten, dass er, jedesmal, wenn er
etwas von MBase ableitet, in seinen Konstruktor am Ende "getParent()->childEvent()" schreiben muß,
oder das er, wenn er mit seinen Widgets fertig ist, MWidget::relayout aufrufen muß.

Wer kann helfen?

peschmae
28-10-2002, 16:03
ich nicht, schliesslich bin ich ja immer so gemein ;-)
anda_skoa wohl schon ;-))

im Ernst: ich verstehe das Problem, aber eine Lösung sehe ich nicht

MfG Peschmä

anda_skoa
28-10-2002, 16:28
Im Konstruktor geht das glaub ich nicht, denn du hast zu diesem Zeitpunkt ja noch keine Instanz der Subklasse.

Man könnte es in der Methode machen, die das Widget anzeigt (zB show());

Oder man hat eine Methode die explizit das Layout neu berechnet.
In Qt geht das glaub ich so.
Wenn ein Widget konstruiert wird und in seinem Konstruktor Unterwidget angeelgt werden, dann wird noch nichts berechnet.
Erst wenn das erstemal show() aufgerufen wird, oder das Widget resized wird, oder updateGeometry() aufgerufen wird, dann werden alle Unterwidgets entsprechenden behandelt.

Wenn ein Unterwidget erzeugt wird, nachdem das Parentwidget sichtbar wurde, wird das neue Widget nicht dargestelllt, bis UnterWidget->show() aufgerufen wurde.
Ich nehme an, dass dort dann das Parentwidget benachrichtigt wird, sein Layout neu zu berechnen.

Ciao,
_

axeljaeger
28-10-2002, 18:34
Dann werde ich das auch so machen. Es wäre ja auch blöd, wenn ich eine Buttonbox fülle, bei jedem Button das Layout neu zu berechnen