fenster mit button öffnen

Du bist neu in der Welt von C++? Dann schau hier herein!
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

fenster mit button öffnen

Beitrag von darkshine »

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: 20. August 2010 11:39

Beitrag von darkshine »

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
TheBert
Beiträge: 21
Registriert: 1. September 2009 14:27

Beitrag von TheBert »

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.
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

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.
TheBert
Beiträge: 21
Registriert: 1. September 2009 14:27

Beitrag von TheBert »

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?
}
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

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.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

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
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

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*
Uncopy
Beiträge: 20
Registriert: 26. August 2010 16:20
Wohnort: Berlin

Beitrag von Uncopy »

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

Beitrag von franzf »

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.
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

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
Uncopy
Beiträge: 20
Registriert: 26. August 2010 16:20
Wohnort: Berlin

Beitrag von Uncopy »

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: 26. August 2010 16:20
Wohnort: Berlin

Beitrag von Uncopy »

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! :-)
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

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 :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

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 ...
Antworten