Seite 1 von 1

Widget als extra Fenster anzeigen lassen

Verfasst: 27. Januar 2007 08:33
von nexus
Hallo,

ich hab folgendes Problem, immer wenn ich ein Widget als extra Fenster mit der Funktion "show()" anzeigen lassen möchte öffnet es sich zwar kurz schließt sich jedoch sofort automatisch wieder. Woran kann dies liegen ?

Verfasst: 27. Januar 2007 09:16
von upsala
Daß du es auf dem Stack anlegst?

Verfasst: 28. Januar 2007 10:01
von nexus
Nein ich leg es nicht auf dem Stack an.

Verfasst: 28. Januar 2007 14:19
von upsala
Dann zeig uns Code...

Verfasst: 28. Januar 2007 15:20
von nexus

Code: Alles auswählen

/* mainWindow.cpp */
#include "addMovie.h"

[...]

void MainWindow::addMovieWindow()
{
	AddMovie add;
	add.show();
}

Code: Alles auswählen

/* addMovie.h */
#ifndef ADDMOVIE_H_
#define ADDMOVIE_H_

#include "ui_AddMovie.h"

class AddMovie : public QWidget
{
    Q_OBJECT

    public:
        AddMovie();

    private:
    	Ui::AddMovie ui;
};

#endif /*ADDMOVIE_H_*/

Code: Alles auswählen

/* addMovie.cpp */
#include "addMovie.h"

AddMovie::AddMovie()
{
	ui.setupUi(this);
}
Wenn ich das Fenster als QDialog mache und es mit exec() aufrufe funktioniert alles so wie es soll.

Verfasst: 28. Januar 2007 15:49
von upsala
Nein ich leg es nicht auf dem Stack an.

Code: Alles auswählen

AddMovie add; 
add.show(); 
Du weist aber schon, was du schreibst, oder? Lern C++...

Verfasst: 28. Januar 2007 16:01
von Christian81
Ich würde es einfach mal mit dem Qt-Tutorial probieren

Code: Alles auswählen

void MainWindow::addMovieWindow()
{
   AddMovie *add = new AddMovie (this);
   add->show();
} 
Könnte ggf. funktionieren

Verfasst: 28. Januar 2007 16:22
von nexus
Christian81 hat geschrieben:Ich würde es einfach mal mit dem Qt-Tutorial probieren

Code: Alles auswählen

void MainWindow::addMovieWindow()
{
   AddMovie *add = new AddMovie (this);
   add->show();
} 
Könnte ggf. funktionieren
Hier passiert gar nichts...

Verfasst: 28. Januar 2007 16:27
von upsala

Code: Alles auswählen

void MainWindow::addMovieWindow() 
 { 
    AddMovie *add = new AddMovie (0); 
    add->show(); 
 } 

Verfasst: 29. Januar 2007 14:50
von MichaelS
Hallo,

meiner bescheidenen Meinung nach liegt das Problem darin begründet, dass AddMovie lokal deklariert ist und sich die "Lebensdauer" des Fensters daher auf die Dauer der Methode addMovieWindow() beschränkt. Da show() das Fenster anzeigt, ohne dabei den Programmablauf zu unterbrechen, wird das Fenster gleich nach dem Anzeigen "wegen Funktionsende" wieder zerstört.

QDialog und exec() haben funktioniert, weil exec() die weitere Programmausführung bis zum Schließen des Fensters blockt.

Gruß Michael

Verfasst: 30. Januar 2007 19:06
von Der Neue
Hallo
Bin der gleichen Meinung wie MichaelS, probier mal folgendes aus:
Definiere den Zeiger auf dein Widget schon in MainWindow.h (oder wie auch immer deine Hauptfenster- oder Hauptdialogklasse heißt):

Code: Alles auswählen

classs MainWindow : public QMainWindow
{
...
   void aufrufendeFunktion();
private:
...
   QWidget * addMovie;
..}
In der Funktion, die das Widget aufruft, weist du dann nur noch dem schon exisitierenden Zeiger Speicher zu und rufst dann show() auf:

Code: Alles auswählen


void MainWindow::aufrufendeFunktion()
{
    addMovie = new AddMovie(this);
    addMovie->show();
}
Soweit ich weiß sorgt Qt sonst automatisch dafür, dass wenn der auf dem Stack abgelegte Zeiger auf dein AddMovie-Widget zerstört wird, auch der Speicher gelöscht wird (d.h. das Widget verschwindet).

mfg