Am Wed den 05 Dec 2001 um 07:16:55AM +0100 schrieb Tobias Koenig:
On Wed, Dec 05, 2001 at 08:13:43PM +0100, Andre Schulze wrote:
Moin,
ich habe hier mal ne Frage an die Qt Experten: warum sind Widgets nicht sichtbar, die als Objekt definiert wurden, wohingegen mittels des new Operators erzeugte Widgets sichtbar sind?
Tobias:
Nicht generell... Eigentlich muss jedes QWidget mittels der Methode 'show()' sichtbar gemacht werden. Wenn du ein Programm schreibst mit einem Object QApplication, weist du ihm ein MainWidget:
QApplication app;
QWidget wdg("toplevel", 0); wdg.show();
app.setMainWidget(&wdg);
int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setFont(QFont("helvetica", 6)); // dies ist die Klasse, in der die Widgets nicht hochkommen wollen: // name ist leer, und es ist das top-level widget QteMUA *qtemua=new QteMUA(0,0);
// das MainWidget sorgt in erster Linie dafür, daß das a.exec() //zurückkehrt, wenn das Widget zerstört wird.
a.setMainWidget(qtemua);
// laut Doku sollte ein show() des Parent Widgets dafür sorgen, daß //die Kinders auch gekritzelt werden, vielleicht stimmen die //Familienverhältnisse bei mir ja nicht... qtemua->show();
return a.exec(); }
Wenn du jetzt ein anderes Widget auf unser gerade erzeugtes Widget draufpappen möchtest, allozierst du es normalerweise mit 'new', gibst im Konstruktor aber einen Pointer auf das Elternobjekt mit:
QWidget *childWidget = new QWidget("child", &wdg);
Das Elternobjekt ruft nun automagisch die show()-Methode all seiner Kinder auf.
So habe ich es auch verstanden und so funzt es ja auch.
Am Thu den 06 Dec 2001 um 08:57:01AM +0100 schrieb Josef Spillner:
On Wednesday 05 December 2001 07:16, Tobias Koenig wrote:
app.setMainWidget(&wdg);
Josef:
Darf ich mal anmerken daß es bei KApplication setMainWidget heißt, bei QApplication aber setCentralWidget? :-)
Es ist glaube ich genau anders herum.
Am Thu den 06 Dec 2001 um 10:21:58AM +0100 schrieb Torsten Werner:
Am Donnerstag, dem 06. Dezember 2001 um 08:57:01, schrieb Josef Spillner:
Noch ein Tip: Qt-Objekte, die ein anderes QObject als Parameter bekommen (also z.B. ein "this"), braucht man im Konstruktor nicht zu löschen, weil das schon die Garbage Collection für einen macht.
Thorsten:
Wieso sollte man Objekte im Konstruktor loeschen wollen? Ausserdem halte
Ist wohl ein Tipfehler... .
ich deine Aussage zur Garbage Collection in dieser Form fuer Quatsch - wie soll das denn funktionieren? Was ist, wenn das Objekt selbst gar nicht dynamisch alloziert wurde?
Josef hat es wahrscheinlich nur etwas unglücklich formuliert. Da ja die GUI idR immer von QWidget abgeleitet ist, erbt man auch dessen Destruktor mit und wenn man den nicht überlädt, dann ruft der die Destruktoren der Child Widgets mit auf. So steht es ungefähr in der Doku:
QWidget::~QWidget()
Destructs the widget.
All children of this widget are deleted first. The application exits if this widget is (was) the main widget.
Mit Garbage Collection hat das aber nichts zu tun. AFAIK ist das in Java ein eigener Thread, der in der VM implementiert ist.
Am Wed den 05 Dec 2001 um 10:01:31PM +0100 schrieb Torsten Werner:
Tutorial ist gleich im ersten Beispiel der Fall dabei, wo ein Widget so instanziiert wurde:
QPushButton hello( "Hello world!", 0 );
Der Blick in die Glaskugel sagt mir, dass du eigentlich ein
QPushButton hello( "Hello world!", this);
willst. Um mehr zu sagen, braeuchte man Beispielquellen.
Innerhalb der Klasse habe ich auch this anstatt 0 (==top_level) verwendet.
Nun ich wollte die Liste nicht mit Code überschwemmen, in der o.g. Klasse QteMUA sieht es also wie folgt aus:
QteMUA::QteMUA( QWidget *parent, const char *name ) : QWidget( parent, name ) { // als Objekt definiert: // this ist parent (FALSE sagt lediglich, dass es readonly ist) QComboBox boxFolders(FALSE,this,"Folders"); // so würde es angezeigt werden (wenn man unten dann // boxFolders.(methode) durch boxFolders->(methode) ersetzen // würde natürlich
//boxFolders = new QComboBox ( FALSE, this, "Folders" ); boxFolders.setGeometry(0,0,80,20); boxFolders.insertItem ( (QString) "Inbox", Inbox ); boxFolders.show();
So bleibt es aber dunkel.
andre