Datenaustausch zwischen Formularklassen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
univeda
Beiträge: 11
Registriert: 27. Juni 2009 16:31

Datenaustausch zwischen Formularklassen

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

form2->setWasauchimmer() ?

Ich glaube das ist eher C++ Basics...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag 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.
Linux, das längste Text-Adventure aller Zeiten
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag 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.
univeda
Beiträge: 11
Registriert: 27. Juni 2009 16:31

Beitrag 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. :wink:
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?
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag 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.
Linux, das längste Text-Adventure aller Zeiten
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag 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.
univeda
Beiträge: 11
Registriert: 27. Juni 2009 16:31

Beitrag von univeda »

Ich habe was gelernt, das gestellte Ziel ist erreicht. :D

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

Code: Alles auswählen

QString test = form1->setVar();
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?
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag von phlox81 »

Dein Setter ist ein Getter :roll:

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
univeda
Beiträge: 11
Registriert: 27. Juni 2009 16:31

Beitrag von univeda »

phlox81 hat geschrieben:Dein Setter ist ein Getter :roll:
Du meinst vom Namen her? Von der Fuktionsweise hast du recht, da müsste ich sie getVar() nennen.
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag von phlox81 »

univeda hat geschrieben:
phlox81 hat geschrieben:Dein Setter ist ein Getter :roll:
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.
Antworten