Seite 1 von 1

Mit einem Fenster ein zweites aufrufen

Verfasst: 3. Oktober 2012 18:21
von Klaus Reinke
Ich versuche mit folgenden 5 Dateien das was im Subject steht:
forum00.txt
(1.77 KiB) 718-mal heruntergeladen
Ich vermute mein Fehler liegt in mainwindow.cpp, bei der Funktion MyWidget::TuWas()
aber wie sähe es korrekt aus?

any Hints?

tia Klaus

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 3. Oktober 2012 19:10
von hakaishi
Klaus Reinke hat geschrieben:Ich versuche mit folgenden 5 Dateien das was im Subject steht:
forum00.txt
Sorry, aber die Datei ist nicht zu öffnen. Du kannst die Dateien hochladen, oder zu einer Seite verlinken, wo du sie hochgeladen hast. Am besten tust du einfach den relevanten Code-Abschnitt posten...

Gruß, Hakaishi

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 3. Oktober 2012 22:29
von veeman
Deine Variable w2 der Klasse My2_Widget ist nur lokal, nach dem verlassen der Funktion wird das Fenster vernichtet.
Du musst es so machen dass es nach verlassen der Funktion immer noch existiert:
vl. als Membervariable des anderen Fensters oder per new, dann jedoch drauf achten dass es auch wieder richtig freigegeben wird.

Mfg veeman

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 3. Oktober 2012 22:48
von hakaishi
Sorry, ich hätte die Datei einfach speichern sollen... mein Browser ist anscheinend zu blöd .txt Dateien mit dem richtigen Programm zu öffnen.

Meinem Vorredner kann ich nur zustimmen. Eine andere Methode wäre noch der QPointer, falls du möchtest, dass das Fenster nicht x-mal beim klicken des Buttons geöffnet wird.

Viele Grüße, Hakaishi

Edit: Hier ein Beispiel mit new

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 4. Oktober 2012 08:38
von franzf
Zuerst: schön dass du deinen Code postest!
ABER: Wenn du mehrere Dateien hast, ist es für und das einfachste, wenn die in einem .zip stecken, da entfällt mühseliges rumkopieren und abspeichern - eingach zip entpacken und loskompilieren.
Hier war der Fehler sofort klar, aber wenns mal etwas mehr Code ist -> als ZIP zur Verfügung stellen.
Dafüt BITTE keinen externen File-Hoster nehmen, sondern die Forenfunktion "Dateianhang hochladen" verwenden!

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 4. Oktober 2012 09:42
von Klaus Reinke
Besten Dank an die Tipps, werde mich erst gegen Abend damit näher beschäftigen können,
da ich mich nur als Amateur mit Qt beschäftige.

Eine Frage noch an Franz, geht auch 'tgz' ?

mfg Klaus

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 4. Oktober 2012 09:47
von franzf
Probiers doch aus ;) früher ging .tar.bz2 z.B. nicht, mittlerweile AFAIK schon.
Und kleiner Nachtrag: schau dass keine Binaries drin sind, also nur Code, .pro und evtl. notwendige resources.

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 5. Oktober 2012 12:37
von Klaus Reinke
Ähem hier war der Fehler sofort klar :?:

nun leuchtet mir schon ein, dass das Fenster gleich wieder entfernt wird beim Verlassen der Funktion
'TuWas()' aber was ändert das wenn ich 'new' verwende? (Mal abgesehen von den neuen Fehlermeldungen)
a-forum121005-1227.zip
(2.8 KiB) 689-mal heruntergeladen
tia Klaus

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 5. Oktober 2012 13:55
von veeman
Wenn du new verwendest dann musst du das auch einer Pointervariable zuweissen, wie zb im Konstruktor:

Code: Alles auswählen

QVBoxLayout *layout = new QVBoxLayout; // wird niemals freigegeben
->

Code: Alles auswählen

My2_Widget *w2 = new My2_Widget;
Jedoch wird bei beidem so wie du es hasst die Objekte nicht freigegeben, dh. jedes mal wenn du auf deine Schaltfläche klickst wird ein neues Fenster erstellt und Speicher reserviert.
Bei extremen Situationen erstellst du mehrere Objekte mit new bis dir irgendwann dass Betriebssystem nein sagt bei der Speicheranfrage und dein Programm zwangshaft beendet werden muss.
Schau dir nochmal genau das Beispiel von hakaishi an, auch das delete. Allgemein schau dir an was Pointer sind und welchen zussamenhang new und delte da spielt.

//Edit:
Wenn du das Fenster per new auf dem Heap erstellst wird nur die Pointervariable nach verlassen der Funktion entfernt, nicht aber das Objekt auf welches diese zeigt.
Deswegen brauchst du die Variable so oder so noch irgendwo um das erstellte Objekt weiterhin verwalten zu können.

Mfg veeman

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 5. Oktober 2012 14:14
von franzf
Du bekommst das Fenster gelöscht, wenn du das Attribut WA_DeleteOnClose setzt.

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 5. Oktober 2012 14:59
von Klaus Reinke
Sorry wenn ich dumme Fragen stelle, aber, was genau ist mit "freigeben" gemeint?

tia Klaus

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 5. Oktober 2012 15:27
von Klaus Reinke
Aaarg in 'TuWas()' hatte ich ein Sternchen vergessen:
also statt:
My2_Widget w2 = new My2_Widget;
My2_Widget *w2 = new My2_Widget;

was die Fehlermeldung auf folgendes reduziert;

mainwindow.cpp: In destructor ‘virtual MyWidget::~MyWidget()’:
mainwindow.cpp:19: error: ‘w2’ was not declared in this scope
make: *** [mainwindow.o] Fehler 1

mfg Klaus

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 6. Oktober 2012 09:01
von franzf
In ~MyWidget() gibts kein w2.
MyWidget hat keinen Member w2.
In den Namensräumen, in denen MyWidget eingebettet ist, gibt es kein w2.
Einzig ein lokales w2 gibt es in TuWas(), auf das du nach Verlassen von TuWas() keinen Zugriff mehr hast.

Re: Mit einem Fenster ein zweites aufrufen

Verfasst: 30. Oktober 2012 14:39
von AQtNewbie
Mehrere Fenster lassen sich so ganz einfach erstellen:

1. Rechtsklick auf Formulardateien im QT Creator - Hinzufügen - Qt - Designer-Formular.
2. Beide Fenster lassen sich (z.B. mit Klicken auf einen Button so verbinden):

Code: Alles auswählen

// mainDlg.cpp
#include <maindlg.h>
#include <ui_maindlg.h>
#include <anotherdlg.h>
//[...]
QObject::connect(ui->anotherDlgButton, SIGNAL(clicked()), this, SLOT(showAnotherDlg()));
//[...]
void mainDlg::showAnotherDlg()
{
    anotherDlg *anotherDlgDlg = new anotherDlg();
    anotherDlg->exec(); // for modal or show() for non-modal dialog
}
Vielleicht hilft dieses Beispiel ja weiter. :)