Ausrichtung von Child Widgets in qt 3.0
-
Hallo zusammen
Durch die Klasse "QVbox" in qt werden Widgets immer optimal z.B. nach
Vergrößerung des Fensters an dieses angepasst. Erstellt man nun ein eigenes Widget (ich nenne es mal "QOwnWidget"), das mehrere andere Widgets(Pushbutton...usw.) enthällt, werden ja auch diese Widgets und QOwnWidget selbst optimal im Fenster angeordnet.Das "QVbox" weiß, das es "QOwnWidget" anordnen soll liegt daran, das durch die Vererbung ja auch der Konstruktor von "QVbox" mitaufgerufen und somit auch der this* Zeiger von "QOwnWidget" an "QVbox" übergeben wird.
Aber woher weiß "QVbox", dass "QOwnWidget" noch andere Widgets enthält, die es ebenfalls anordnen muss?
Beispiel aus der qt Reference Dokumentation:
#include <qapplication.h> #include <qpushbutton.h> #include <qslider.h> #include <qlcdnumber.h> #include <qfont.h> #include <qvbox.h> class MyWidget : public QVBox { public: MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name ) : QVBox( parent, name ) { QPushButton *quit = new QPushButton( "Quit", this, "quit" );//hier z.B. quit->setFont( QFont( "Times", 18, QFont::Bold ) ); connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); QLCDNumber *lcd = new QLCDNumber( 2, this, "lcd" );//oder dieses Widget?? QSlider * slider = new QSlider( Horizontal, this, "slider" ); slider->setRange( 0, 99 ); slider->setValue( 0 ); connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); } int main( int argc, char **argv ) { QApplication a( argc, argv ); MyWidget w; a.setMainWidget( &w ); w.show(); return a.exec(); }
-
Erst einmal, funktioniert das jetzt überhaupt so wie du es dir vorstellst oder funktioniert es nicht ??
Ich sage mal Spontan daß deine Klasse MyWidget durch die Parent Angabe "this" bei QPushbutton ... weiß, daß es noch andere Objekte enthält.Gruß Blacknator
-
Ja es funktioniert schon!
Es wird ein Fenster mit einem LCDNumber Widget, einen Slider und einem
Pushbutton generiert.Wenn man die Größe des Fensters verändert, passen sich
der Pushbutton, der Slider und die LCDNumber optimal dem Fenster an (ausrichtung zur mitte usw.....).Durch die Angabe des *this Zeigers bei den Child Widgets wissen ja nur die
childs, das sie ein Parent Widget haben, aber woher weiß MyWidget, das
es Childs hat?
Der *this kann ja nicht einfach zurückverfolgt werden oder?Und wie erkennt QVbox, das es auch die Childs von MyWidget anordnen soll,
wenn das Fenster verändert wird.
-
1. Die Klasse MyWidget weiß nicht das es noch childs hat, außer du machst bei der Klassendefinition auch die Definition vom QPushButton usw, dann kannst du auch außerhalb des Konstruktors auf die Widgets wie QPushButton zugreifen.
z.B.
class MyWidget : public QVBox { public: MyWidget( QWidget *parent=0, const char *name=0 ); QPushButton *quit; QSlider *slider; }; MyWidget::MyWidget( QWidget *parent, const char *name ) : QVBox( parent, name ) { quit = new QPushButton( "Quit", this, "quit" ); ... }
2. MyWidget erbt die Klasse QVBox und wie voher schon geschrieben gibst du bei der Deklaration vom QPushButton als Parent "this" an, und da von QVBox geerbt wurde weiß dein Widget daß es die Childs auch vergrößern und verkleinern soll.
Etwas deutlicher geworden ?
-
Die Klassendefinition ist gar nicht nötig, damit MyWidget weiß dass es
noch childs hat.
Denn das obige Programm läuft ja auch ohne wie erwartet.Wenn wir also im Konstruktor noch andere Widgets erstellen, diesen dann
den this auf MyWidget mitgeben, wissen die Childs dass MyWidget ihr Parent ist
<na toll> aber MyWidget kennt doch die Childs nicht, denn MyWidget hat ja
keine Zeiger darauf oder irgendeine andere Verbindung, auf dei es sich beziehen kann.das gleiche in diesem Code ausschnitt:
class LCDRange : public QVBox { public: LCDRange( QWidget *parent=0, const char *name=0 ); }; LCDRange::LCDRange( QWidget *parent, const char *name ) : QVBox( parent, name ) { QLCDNumber *lcd = new QLCDNumber( 2, this, "lcd" ); QSlider * slider = new QSlider( Horizontal, this, "slider" ); slider->setRange( 0, 99 ); slider->setValue( 0 ); connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); } //----------------------------------------------- int main( int argc, char **argv ) { QApplication a( argc, argv ); QGrid *grid = new QGrid( 4, 0); for( int r = 0 ; r < 4 ; r++ ) for( int c = 0 ; c < 4 ; c++ ) (void)new LCDRange( grid ); a.setMainWidget( &grid ); grid->show(); return a.exec(); }
Woher soll das Widget "grid" wissen, das es 16 "LCDRange" Widgets in einem
Gitter anordnen soll? Es wissen ja nur die 16 LCDRange Widgets ,das grid
für sie Verantwortlich ist (über den this auf grid)....
-
Ich bin immer noch der Meinung daß das Widget grid durch die Vererbung weiß wieviele Widgets anzuordnen sind. Wenn du anderer Meinung bist dann schau dir den Sourcecode der Klasse an oder schreibe eine direkte Mail an den Entwickler der Klassen für 100%ige Antworten.
Wenn sonst noch was in diese Richtung unklar ist kann ich dir leider nicht mehr weiterhelfen.