fenster mit button öffnen

Du bist neu in der Welt von C++? Dann schau hier herein!

Moderatoren: Christian81, franzf

fenster mit button öffnen

Beitragvon darkshine » Do Aug 26, 2010 13:16

Ich habe mit Qt Designer ein MainWindow erstellt

Hauptfester.h

Code: Alles auswählen
 
#include "ui_Hauptfenster.h"

class Hauptfenster: public QMainWindow
{
   Q_OBJECT


public:
   Hauptfenster(QWidget *parent = 0);
   ~Hauptfenster(void);
private:
        Ui::MainWindow ui;



Hauptfester.cpp

Code: Alles auswählen
Hauptfenster:Hauptfenster(QWidget *parent)
: QMainWindow(parent)
{
   ui.setupUi(this);

}


Dazu kommt noch die main.cpp. Ich kenne nur diese Art ein Fenster anzeigen zu lassen. Habe es praktisch einfach aus einem Beispiel rüberkopiert.
In diesem Fester sind dann noch Buttons mit denen ich andere Funktionen/Slots aufrufe.

Jetzt habe ich ein zweites Fester mit Qt Designer erstellt und möchte mir dieses gerne auf Knopfdruck im Hauptfenster anzeigen lassen.

Ich habe eine Klasse festerZwei erstellt

Code: Alles auswählen
class festerZwei : public QWidget

{
   
   Q_OBJECT

public:
   festerZwei(QWidget *parent = 0);
   ~festerZwei();

private:
   Ui::festerZwei UiZwei;   

};


In der cpp

Code: Alles auswählen
festerZwei::festerZwei(QWidget *parent)
  : QWidget(parent)
{
   UiZwei.setupUi(this);
}

festerZwei::~festerZwei()
{
   
}


Nun rufe ich in meinem Hauptfester per Button folgende Zeilen auf

Code: Alles auswählen
QWidget w;
festerZwei *neuesFester = new festerZwei(&w);
w.show();


Es wird such ganz kurz angezeigt, verschwindet aber sofort wieder. Es muss auch nicht unbedingt in zwei Klassen sein. Hätte es sogar lieber in einer.
Ich habe es halt so ähnlich wie mit dem Hauptfester versucht.
Die Codebeispiele habe ich verändert und vereinfacht. Sollen nicht vollständig oder 100% korrekt sein.
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon darkshine » Do Aug 26, 2010 13:49

Man...es liegt wohl daran, dass ich wegen einer muskelentzündung schmerztabletten geschluckt habe. aber ich finde nichts.
es ist bestimmt etwas ganz simples. Schließlich werden häufig mit Buttons neue Fenster geöffnet.
Ich schaffe es einfach nicht unter Qt zwei Fenster gleichzeiti zu öffnen. Anscheinend muss ich QDialog in irgendeiner Form nutzen
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon TheBert » Do Aug 26, 2010 14:11

Klingelts beim stichwort "scope"?

Event. solltest du posten wie du das zweite fenster aufrufen möchtest (code) und nicht die standard sourcetemplates von zwei klassen.
TheBert
 
Beiträge: 21
Registriert: Di Sep 01, 2009 13:27

Beitragvon darkshine » Do Aug 26, 2010 14:30

Ich versuche das zweite Fester so zu öffnen

[code]
void Hauptfester::on_ButtonConnect_clicked()
{
QWidget w;
festerZwei *neuesFester = new festerZwei(&w);
w.show();
}
[/code]

Im wenn ich auf den Button drücke erscheint es auch ganz kurz, verschwindet aber sofort wieder.

ne scope sagt mir leider gar nichts.

Dazu sollte ich sagen, dass ich C++-Programmierer bin und mich mit grafischen Oberflächen wirklich nicht auskenne.
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon TheBert » Do Aug 26, 2010 14:37

darkshine hat geschrieben:ne scope sagt mir leider gar nichts.

Dazu sollte ich sagen, dass ich C++-Programmierer bin und mich mit grafischen Oberflächen wirklich nicht auskenne.


Das hat nichts mit oberflächen zu tun, sondern mit c++ grundlagen!

Code: Alles auswählen
void Hauptfester::on_ButtonConnect_clicked()
{
QWidget w;
//was passiert wenn du hier eine instanz anlegst
festerZwei *neuesFester = new festerZwei(&w);
w.show();
//welche hier wieder zerstört wird? Wie lange existiert das fenster?
}
TheBert
 
Beiträge: 21
Registriert: Di Sep 01, 2009 13:27

Beitragvon darkshine » Fr Aug 27, 2010 6:22

Das Fenster existiert ca. eine halbe Sekunde. Ich sehe es nur kurz aufleuchten.
Ich möchte erreichen, dass mit einem Kopfdruck ein neues Fenster öffne, welches ich mit dem Qt-Designer erstellt habe. Schwierig ist das bestimmt nicht, aber gestern fand ich einfach keine Lösung. Ich hoffe heute erreiche ich mehr.
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon Nvidia » Fr Aug 27, 2010 6:29

Das ist auch nicht schwierig, wenn man vorher sein c++ gelernt hat ;-)
QWidget w; ueberlebt die Methode nicht, es wird am Ende zerstoert.
QWidget *w = new QWidget; ueberlebt die Methode, also bleibt da, aber du musst dich selbst um die Zerstoerung kuemmern.
nvidia
Nvidia
 
Beiträge: 238
Registriert: Mo Feb 22, 2010 21:23

Beitragvon darkshine » Fr Aug 27, 2010 7:30

Yeah Danke schön

man man...ich werd mir mal die zeit nehmen müssen und mir mal die grundlagen aneignen müssen und nicht einfach drauf los tippen und schauen was passiert.

aber viele wege und besonders der weg übers qtforum führen zum erfolg :-)

*ich verbeug mich*
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon Uncopy » Fr Aug 27, 2010 7:32

darkshine hat geschrieben:Ich versuche das zweite Fester so zu öffnen

Code: Alles auswählen
void Hauptfester::on_ButtonConnect_clicked()
{   
     QWidget w;
     festerZwei *neuesFester = new festerZwei(&w);
     w.show();    
}


Im wenn ich auf den Button drücke erscheint es auch ganz kurz, verschwindet aber sofort wieder.

ne scope sagt mir leider gar nichts.

Dazu sollte ich sagen, dass ich C++-Programmierer bin und mich mit grafischen Oberflächen wirklich nicht auskenne.


Was du im angegebenen Beispiel kurz aufflackern siehst, ist vermutlich das QWidget w, denn dieses zeigst du per show() an. Das Fenster neuesFenster zeigst du hingegen gar nicht an, aber erzeugst es.

Mit Scope ist der Gültigkeitsbereich von Vereinbarungen gemeint. Im Beispiel gilt die Vereinbarung von w nur bis zur schließenden Klammer des Blocks, in dem du sie deklariert hast. Da es sich um eine automatische Variable handelt, wird sie durch die Deklaration erzeugt (hier wird der Konstruktor des Klasse QWidget aufgerufen) und direkt vor der schließenden Klammer zerstört (hier wird der Destruktor ~QWidget aufgerufen), was im Quelltext nicht zu sehen ist, aber jeder C++-Compiler kümmert sich darum.

Möglich, dass du bestimmte C++-Aspekte bislang kaum nutzt - ich vermute, du kommst von C her?
Uncopy
 
Beiträge: 20
Registriert: Do Aug 26, 2010 15:20
Wohnort: Berlin

Beitragvon franzf » Fr Aug 27, 2010 7:46

Uncopy hat geschrieben:Das Fenster neuesFenster zeigst du hingegen gar nicht an, aber erzeugst es.

neuesFenster ist child von w, bekommt bei einem w.show() ebenfalls sichtbar.
franzf
 
Beiträge: 3114
Registriert: Mi Mai 31, 2006 10:15

Beitragvon darkshine » Fr Aug 27, 2010 7:48

erschreckend wie leicht ich zu durchschauen bin...und da machen sich die leute sorgen über google :-) jepp ich mixe auch gerne noch c und c++ code.

die objektorientierung funktioniert mit den schönen beispielen "konto" und "mitarbeiter" schon gut, aber hier merkt man doch das ich keine ahnung habe. zurück zum thema
ich brauche ja wirklich nur sehr einfache oberflächen, mit der algorithmen im hintergrund gestartet werden.
ich hoffe das fenster klappt jetzt so wie ich mir das vorgestellt habe
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon Uncopy » Fr Aug 27, 2010 8:08

franzf hat geschrieben:neuesFenster ist child von w, bekommt bei einem w.show() ebenfalls sichtbar.


Oh, das hatte ich völlig übersehen, danke für den Augenöffner :-)

Ist es eigentlich hier im Qt-Forum üblich, das Rätsel zu diesem Zeitpunkt bereits zu lüften? Ich würde ja gern mal hinschreiben, wie ich meine dass das Beispiel wie gewünscht funktionieren sollte.
Uncopy
 
Beiträge: 20
Registriert: Do Aug 26, 2010 15:20
Wohnort: Berlin

Beitragvon Uncopy » Fr Aug 27, 2010 8:13

darkshine hat geschrieben:erschreckend wie leicht ich zu durchschauen bin...und da machen sich die leute sorgen über google :-) jepp ich mixe auch gerne noch c und c++ code.


Ich kenn das Bild des C-Umsteigers beruflich. Aber meist sind die C++-Compiler eh besser ("klüger") und schon deshalb lohnt sich der Umstieg. Auch kann man fremden OO-Code in ansonsten "reinen" C-Programmen mitunter angenehm nutzen. C++ und überhaupt OO richtig zu lernen, lohnt sich m.E. in jedem Fall. Wenn du versuchst zu verstehen, wie Qt tickt, hast du es so ziemlich mit den besten Beispiele für OO in C++ zu tun, dies gibt.

darkshine hat geschrieben:ich hoffe das fenster klappt jetzt so wie ich mir das vorgestellt habe


Lass doch mal sehen! :-)
Uncopy
 
Beiträge: 20
Registriert: Do Aug 26, 2010 15:20
Wohnort: Berlin

Beitragvon darkshine » Fr Aug 27, 2010 8:42

Sobald alles läuft wie es wünsche poste ich es.

Jetzt wo das zweite Fenster angezeigt wird. Geht es weiter und die beiden sollen miteinander kommunizieren. Aber alles schön langsam heute. Es ist schließlich freitag :)
darkshine
 
Beiträge: 102
Registriert: Fr Aug 20, 2010 10:39

Beitragvon RHBaum » Fr Aug 27, 2010 10:09

wie Qt tickt, hast du es so ziemlich mit den besten Beispiele für OO in C++ zu tun

Das würd ich nicht so stehen lassen.

die Qt verstoesst schon gegen ein paar ganz elementare Punkte in Sachen OOP und C++. (Bsp: Autodelete mechanismen, und implizietes sharing -> Seiteneffekte sind zumindest umstritten).
Aber das eher zum Wohle des Programmieres als zu dessem Nachteil.
"Perfektes OOP" in c++ sieht kleinwenig anders aus, aber ist im Context eines GUI-Frameworkes kaum möglich zu implementieren. Von daher macht die Qt schon nen ganz guten Kompromiss zwischen OOP Technik und Anwenderfreundlichkeit für die meisten der Anwender.
Wer was spezielles braucht, was sich mit den Mechanismen beisst, der wird eh keine qt nehmen ....

Ciao ...
RHBaum
 
Beiträge: 1354
Registriert: Fr Jun 17, 2005 8:58

Nächste

Zurück zu C++ Grundlagen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste