Mit einem Fenster ein zweites aufrufen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Klaus Reinke
Beiträge: 19
Registriert: 28. April 2008 18:26
Wohnort: Milkyway

Mit einem Fenster ein zweites aufrufen

Beitrag von Klaus Reinke »

Ich versuche mit folgenden 5 Dateien das was im Subject steht:
forum00.txt
(1.77 KiB) 475-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
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
Dateianhänge
forum00.txt
(1.88 KiB) 414-mal heruntergeladen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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!
Klaus Reinke
Beiträge: 19
Registriert: 28. April 2008 18:26
Wohnort: Milkyway

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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.
Klaus Reinke
Beiträge: 19
Registriert: 28. April 2008 18:26
Wohnort: Milkyway

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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) 439-mal heruntergeladen
tia Klaus
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mit einem Fenster ein zweites aufrufen

Beitrag von franzf »

Du bekommst das Fenster gelöscht, wenn du das Attribut WA_DeleteOnClose setzt.
Klaus Reinke
Beiträge: 19
Registriert: 28. April 2008 18:26
Wohnort: Milkyway

Re: Mit einem Fenster ein zweites aufrufen

Beitrag von Klaus Reinke »

Sorry wenn ich dumme Fragen stelle, aber, was genau ist mit "freigeben" gemeint?

tia Klaus
Klaus Reinke
Beiträge: 19
Registriert: 28. April 2008 18:26
Wohnort: Milkyway

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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.
AQtNewbie
Beiträge: 23
Registriert: 1. Oktober 2012 13:03

Re: Mit einem Fenster ein zweites aufrufen

Beitrag 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. :)
Antworten