Seite 1 von 1

fensterkommunikation

Verfasst: 17. März 2009 14:08
von mine
hallo!

ich bin recht neu hier und leider auch ein qt und c++ -looser... wenn ich also etwas dummes frage, liegt das nicht daran, dass ich das Handbuch nicht gelesen habe...

Ich bekomme es nicht hin eine variable an eine neue form zu übergeben und dann von dieser eine andere zurückzubekommen.

ich suche also nach dem int funktion(QString test) oder so in meinem neuen Fenster. kann mir da jemand helfen??

danke!

Verfasst: 17. März 2009 14:12
von RavenIV
Was hast Du denn schon ausprobiert?
Wo hängst Du?
Was genau funktioniert nicht?

Zeig mal ein Bisschen Code und man kann Dir helfen.

nein

Verfasst: 17. März 2009 14:18
von mine
nein, ich habe ein gaaaanz allgemeines problem: ich habe ein mainwindow.
jetzt erstelle ich eine neue fensterklasse, zum Beispiel irgendeinen dialog, der von Mainwindow aus aufgerufen wird.

bei c# finde ich jetzt eine funktion im neuen fenster, der ich eine variable übergeben und die dann etwas anderes returnen kann. bei qt finde ich nur irgendwelche konstruktoren, die mir nix sagen...

im mainwindow sollte irgendwas stehen wie

NeuesFenster f;

QString returnte_variable = f.show(übergebene variable)

Verfasst: 17. März 2009 14:32
von CLRS530
Du rufst show ohne Parameter auf. Richtest dir member Variablen in der neuen Klasse ein und setzt diese mit setVar(var).

Code: Alles auswählen

private:
   int var;
public:
    void setVar(int var);
Ok ich sehe wo es bei dir hängt. Du willst einen modalen Dialog mit Rückgabewert aufrufen. Das geht auch nicht mit show(), das machst du mit exec(). In diesem Falle setzt du deinen benötigten Variablen vor dem Aufruf.
exec gibt allerdings nur accept und reject zurück, welches du über Button oder ähnliches steuern kannst. Wenn dir das nicht genug ist, kannst du dir QDialog ableiten.

ahhhh

Verfasst: 17. März 2009 15:02
von mine
AH! Danke, das Prinzip habe ich jetzt verstanden - ich habe also das:

Code: Alles auswählen

void MainWindow::on_b_filter_clicked()
{
    filter f;
    f.setVar(datenbank);
    f.exec();
}
in meinem Hauptfenster, und in der Header vom Filter das:

Code: Alles auswählen

...
class filter : public QDialog {
    Q_OBJECT
    Q_DISABLE_COPY(filter)
public:
    explicit filter(QWidget *parent = 0);
    virtual ~filter();
    void setVar(QString datenbank);

protected:
    virtual void changeEvent(QEvent *e);

private:
    Ui::filter *m_ui;
    QString datenbank;
...
stehen. Leider bekomme ich jetzt noch eine Fehlermeldnung, nämlich:
undefinied reference to Filter::setVar(QString)

was mache ich da?
danke!
[/code][/quote]

Verfasst: 17. März 2009 15:05
von CLRS530
Na selbstverständlich musst du die Funktion setVar auch implementieren.
Also darin this->datenbank = datenbank;

Verfasst: 17. März 2009 15:14
von mine
habe ich:

Code: Alles auswählen

void setVar(QString datenbank)
{
   db = datenbank;
}
ich habe den private datenbank rausgeschmissen und QString db in filter.cpp global, also vor den Funktionen gesetzt... die undefi. reference bekomme ich aber trotzdem noch. hm...

danke übrigens für die Geduld! ich bin leider Physik-Student und soll so einen Bildverabeitungsfilter in eine GUI anbauen.

Verfasst: 17. März 2009 15:17
von RavenIV
mine hat geschrieben:habe ich:

Code: Alles auswählen

void setVar(QString datenbank)
{
   db = datenbank;
}
Es muss aber so aussehen:

Code: Alles auswählen

void filter::setVar(QString datenbank)
{
   db = datenbank;
}
Sonst ist es nämlich keine Methoder der Klasse Filter.

Verfasst: 17. März 2009 15:21
von mine
JUJU! danke, es funktioniert!

Verfasst: 17. März 2009 16:46
von mine
jetzt doch nochmal in die andere richtung: mein "dialog" ist relativ aufwendig und ich muss einige variablen zurückgeben - dazu scheint qdialog nicht geeignet? wie würdet ihr das tun?

danke!

Verfasst: 17. März 2009 16:53
von pfid

Code: Alles auswählen

QString filter::getVar()
{
   return db;
} 

int bla()
{
   QString bla = dialog->getVar();
}


Verfasst: 17. März 2009 19:21
von Strahlex
Du kannst die set Prozeduren auch gleich in die Headerdatei schreiben, das ist auf Dauer übersichtlicher.

Code: Alles auswählen

public:
    int var() const {return myVar;}
    void setVar(const int x) {myVar = x;}

private:
    int myVar;