Widget als extra Fenster anzeigen lassen

Alles rund um die Programmierung mit Qt
Antworten
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Widget als extra Fenster anzeigen lassen

Beitrag 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 ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Daß du es auf dem Stack anlegst?
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag von nexus »

Nein ich leg es nicht auf dem Stack an.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann zeig uns Code...
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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++...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

void MainWindow::addMovieWindow() 
 { 
    AddMovie *add = new AddMovie (0); 
    add->show(); 
 } 
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag 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
Der Neue
Beiträge: 24
Registriert: 31. Mai 2006 14:45

Beitrag 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
Gesegnet sein all die, die nichts zu sagen haben
und trotzdem den Mund halten.
Antworten