Seite 1 von 1

[Geloest] QStringList per Referenz an Class uebergeben

Verfasst: 27. Oktober 2008 08:07
von gboelter
Hallo,

ich scheitere gerade an dem Versuch eine QStringList aus der main.cpp per Referenz an den Construktor einer Klasse zu uebergeben, wobei das Problem nicht die Uebergabe selbst ist, die klappt schon, sondern die Weiterverarbeitung meiner Liste an eine Memberfunktion.

Hier zunaechst mal die main.cpp

Code: Alles auswählen

int main ( int argc, char* argv[] )
{
    QApplication app ( argc, argv );

    QStringList stringList;

    userAnmeldung userDialog ( stringList );

    int ret = userDialog.exec();

    if ( ret != QDialog::Accepted )
        return 1;

    QApplication::exit();

    qDebug() << stringList; //   ("Willi", "Winzig")

    MainWindow myMainWindow ( stringList );
    myMainWindow.show();

    return app.exec();
}
Und in der userAnmeldung.cpp dann:

Code: Alles auswählen

userAnmeldung::userAnmeldung( QStringList &stringList .... )
        : myStringList( stringList )
{
    setupUi( this );

    QStringList &myList = stringList;
    myList << "Willi" << "Winzig";

    // more code
}
Bis dahin scheint es auch zu klappen alles, denn nach Rueckkehr aus userAnmeldung enthaelt die Liste die richtigen Werte.

Mein Problem ist nun, dass "stringList" bis dahin ja nur im Construktor bekannt und entsprechend geaendert werden kann. Ich moechte den Inhalt von stringList aber auch in einer Memberfunktion bearbeiten koennen. Normalerweise wuerde ich dann einfach die entsprechende Variable an die Funktion uebergeben. Hier wird meine Memberfunktion aber per

Code: Alles auswählen

connect( pushButtonOk, SIGNAL ( pressed() ), this, SLOT ( accept() ));
aufgerufen.

Wie ereiche ich es nun, dass auch meine Memberfunktion stringList kennt? Muss ich mir da irgendwas mit QSignalMapper basteln oder gibt's da eine einfachere Moeglichkeit, die ich im Moment nur vor lauter Baeumen uebersehe?

Wohlbemerkt, und eben das ist mein Problem, auch an die Memberfunktion soll stringList per Referenz uebergeben werden, damit die veraenderte Liste auch wieder in der main.cpp zur Verfuegung steht.

Danke im voraus.

Verfasst: 27. Oktober 2008 08:21
von Christian81
Wie wäre es wenn Du die Stringlist als Member der Klasse speicherst?

Verfasst: 27. Oktober 2008 08:26
von solarix

Code: Alles auswählen

Wie ereiche ich es nun, dass auch meine Memberfunktion stringList kennt? 
Dann deklariere halt deine Membervariabel "myStringList" als Referenz:

Code: Alles auswählen

class userAnmeldung  {
....
  private:
    QStringList &myStringList;
...
};
der Rest hast du ja schon (Initialisierung im Konstruktor).

Aber nebenbei: das ist keine schöne Lösung die du da hast. Ich würde doch einfach nach dem Anmelden das Resultat holen:

Code: Alles auswählen

if ( ret != QDialog::Accepted )
        return 1; 
QStringList result = userAnmeldung.result();  // returns myStringList ....
hth,
solariX


PS.

Code: Alles auswählen

userAnmeldung userDialog ( stringList ); 
das ist extrem schlechter Stil... Frag mal einen Entwickler einer anderen Programmiersprache (z.B. VB.NET), welches die Klasse ist und welches die Variabel...
Besser ist:

Code: Alles auswählen

UserAnmeldung userDialog ( stringList ); 
dann:

Code: Alles auswählen

QStringList stringList; 
auch schlechter Stil, weil nicht klar ist, was darin gespeichert wird. besser:

Code: Alles auswählen

QStringList userNameAndPassword;
oder

QStringList loginProfile; // name, wohnort, keine Ahnung was noch...
und das falsche Forum ist es auch noch (C++ Grundlagen+)

Verfasst: 27. Oktober 2008 08:52
von gboelter
Christian81 hat geschrieben:Wie wäre es wenn Du die Stringlist als Member der Klasse speicherst?
Danke Christian,

genau das habe ich uebersehn .... :(

Und jetzt klappt's wunderbar. :D

Verfasst: 27. Oktober 2008 09:04
von gboelter
Hallo solarix,

danke fuer Deine konstruktive Kritik an meinem Code, ich werde mich bessern.

Normalerweise verwende ich auch eher Bezeichener wie

Code: Alles auswählen

    void lineEditKundenMatchcode_textChanged(QString);
    void showContextMenuForWidget(const QPoint &pos);
aber im Beispiel hatte ich wirklich reichlich geschlampt. Ich weiss aber auch, dass ich noch sehr viel lernen muss und bin daher fuer konstruktive Kritik immer dankbar.