Seite 1 von 1
Datenaustausch zwischen Formularklassen
Verfasst: 10. Juli 2009 00:47
von univeda
Ich habe zu diesem Thema einiges in diesem und anderen Foren gelesen, leider bisher ohne Erfolg.
Ich habe 2 Formularklassen form1 und form2. In form1 fülle ich eine Variable QString var1 = "test1". Dann erzeuge ich in form1 eine neue Instanz von form2 und zeige form2 an.
Code: Alles auswählen
void Form1::on_action_Button_triggered()
{
QString var1 = "test1";
Form2 *form2 = new Form2(this);
form2->show();
}
Nun möchte ich in form2 aber auf die in form1 gefüllte Variable var1 zugreifen. Wie gehe ich da am besten vor?
Sind Signals&Slots da das richtige Mittel und wenn ja, wie wende ich sie in meinem Beispiel an?
Verfasst: 10. Juli 2009 06:31
von Christian81
form2->setWasauchimmer() ?
Ich glaube das ist eher C++ Basics...
Verfasst: 10. Juli 2009 09:11
von RavenIV
Es ist C++-Grundwissen, aber ich will mal nicht so sein.
- Var1 muss eine Member-Variable sein. Am Besten eine private.
- in Form1 schreibst Du dann eine public Methode SetVar1(...)
- diese Methode kannst Du von Form2 aufrufen
Dies ist nur das Grundgerüst. Du sollst ja auch noch was zum Arbeiten haben.
Und wenn ich Dir alles nur Vorkaue, dann lernst Du nichts bei der Sache und musst nächstes mal wieder fragen.
P.S. Form1, Form2 und Var1 sind keine allzu tollen Bezeichner.
Verfasst: 10. Juli 2009 09:12
von solarix
Sind Signals&Slots da das richtige Mittel und wenn ja, wie wende ich sie in meinem Beispiel an?
Signals/Slots sind in diesem Fall ein mögliches Mittel um ändernde Daten von form1 form2 mitzuteilen , ja.. Anwendung siehe Doku:
http://doc.trolltech.com/4.5/signalsand ... ll-example
Aber wie bereits geschrieben wurde: da form1 ja form2 kennt, kann doch form1 gleiche alle Daten selber mitteilen (entweder über setXy(...) oder im CTor, falls da schon alles bekannt ist).
hth..
Verfasst: 10. Juli 2009 09:49
von phlox81
In der Regel legt man eine Methode an, in der man dann die Daten übergibt.
Ob einzelnd, oder als struct/tuple/liste/record hängt vom Anwendungsfall ab.
Verfasst: 10. Juli 2009 10:43
von univeda
Danke euch allen erst einmal für die Tipps. Sicher ist das C++ Grundwissen, aber ich will es auch endlich mal verstehen... Und mit eurer Hilfe wird das schon klappen. Ich hoffe ihr haltet so lange durch.
RavenIV hat geschrieben:Es ist C++-Grundwissen, aber ich will mal nicht so sein.
- Var1 muss eine Member-Variable sein. Am Besten eine private.
- in Form1 schreibst Du dann eine public Methode SetVar1(...)
- diese Methode kannst Du von Form2 aufrufen
Dies ist nur das Grundgerüst. Du sollst ja auch noch was zum Arbeiten haben.
Und wenn ich Dir alles nur Vorkaue, dann lernst Du nichts bei der Sache und musst nächstes mal wieder fragen.
P.S. Form1, Form2 und Var1 sind keine allzu tollen Bezeichner.
Var1 muss eine Member-Variable von Form1 und Form2 sein? Also jeweils in form1.h und form2.h folgendes?
Code: Alles auswählen
form1.h
class Form1 : public QMainWindow
{
Q_Object
public:
private:
QString Var1;
...
};
form2.h
class Form2 : public QDialog
{
Q_Object
public:
private:
QString Var1;
...
};
Habe ich das richtig verstanden?
Verfasst: 10. Juli 2009 10:57
von RavenIV
univeda hat geschrieben:
Var1 muss eine Member-Variable von Form1 und Form2 sein? Also jeweils in form1.h und form2.h folgendes?
Habe ich das richtig verstanden?
Nein.
Var1 wird nur in Form1 benötigt.
Dazu eine Setter-Funktion in Form1, die von Form2 aufgerufen werden kann.
Verfasst: 10. Juli 2009 11:31
von phlox81
Eigentlich sollte man das vermeiden.
In eine Formklasse gehören keine Datenmember, wenn man sich nach MVC orientiert, sollte es zumindest eine Klasse geben, die die Daten hält. (Und in den Ctrls liegen die Werte ja sowieso)
In dem Moment wo Form2 einen Setter von Form1 aufrufen muss, hast du auch eine Abhängigkeit zu Form1, die vorher nicht vorhanden war.
Verfasst: 10. Juli 2009 16:21
von univeda
Ich habe was gelernt, das gestellte Ziel ist erreicht.
So habe ich das nun umgesetzt:
form1.h
Code: Alles auswählen
namespace Ui
{
class Form1;
}
class Form2; <-- forward-deklaration
class Form1 : public QMainWindow
{
Q_OBJECT
public:
Form1(QWidget *parent = 0);
~Form1();
Form2 *form2; <-- Instanz der Form2-Klasse
QString setVar(); <-- public setter-methode
private:
Ui::Form1 *ui;
QString var1;
private slots:
};
form1.cpp
Code: Alles auswählen
QString Form1::setVar()
{
QString var1= "dies_ist_ein_test";
return var1;
}
form2.h
Code: Alles auswählen
#include "form1.h"
namespace Ui
{
class Form2;
}
class Form1; <-- forward-deklaration
class Form2 : public QDialog
{
Q_OBJECT
public:
Form2(QWidget *parent = 0);
~Form2();
Form1 *form1; <-- Instanz der Form1-Klasse
protected:
void changeEvent(QEvent *e);
private:
Ui::Form2 *m_ui;
};
form2.cpp
Somit kann ich in Form2 auf var1 aus Form1 zugreifen.
Kann ich daran noch etwas verbessern (die verwendeten Namen sind nur für diesen Test-Case, ich verwende ansonsten sprechende Klassen- und Variablenbezeichnungen)?
Und des Weiteren kommt mit dem Erfolg kommt die Gier... wie stelle ich es am besten an, wenn ich mit diesem Verfahren mehrere Variablen übergeben möchte? Evtl. mit einem String-Array?
Verfasst: 10. Juli 2009 17:27
von phlox81
Dein Setter ist ein Getter
Und wie du schon bemerkt hast, ist die Lösung nicht wirklich elegant.
Wenn du die Daten von der Darstellung trennst, kannst du das auch jeweils an einen Dialog übergeben:
Code: Alles auswählen
MyData data;// das kann z.b. in Form1 eine member variable sein
MyDialog dlg(this);
dlg.loadData(data);// transferdata übergibt den Inhalt an die Dialogctrls.
phlox
Verfasst: 10. Juli 2009 17:42
von univeda
phlox81 hat geschrieben:Dein Setter ist ein Getter

Du meinst vom Namen her? Von der Fuktionsweise hast du recht, da müsste ich sie getVar() nennen.
Verfasst: 10. Juli 2009 17:48
von phlox81
univeda hat geschrieben:phlox81 hat geschrieben:Dein Setter ist ein Getter

Du meinst vom Namen her? Von der Fuktionsweise hast du recht, da müsste ich sie getVar() nennen.
Vom allgemeinen Verständnis her. Ein Setter verändert eine Variable in einer Klasse, und ein Getter gibt sie zurück.