Seite 1 von 1
Argumentübergabe zum neuen Fenster
Verfasst: 11. September 2010 18:40
von user710
Hallo,
ich versuche nach dem Starten des neuen Fenster Argumente für die "Weiterverarbeitung" zu übergeben.
Konkret zu meinem Beispiel:
Ich baue mir gerade ein notifyme Programm. Nun will ich im Main-Fenster die Liste aller eingetragenen Personen mit Mails zeigen und im 2 Fenster soll besteht die Möglichkeit, die Liste zu erweitern.
Nun möchte ich euch meinen bisherigen Code in Ausschnitten zeigen.
Die Main.h Datei
Code: Alles auswählen
...
#include <QtGui>
...
struct Data
{
int id;
QString vorname;
QString nachname;
QString emailadresse;
bool status;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
...
QVector<Data> adressen;
private:
Ui::MainWindow *ui;
public slots:
void add();
void save();
};
...
Die dazugehörige .cpp Datei:
Code: Alles auswählen
...
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
...
connect(ui->hinzufuegen, SIGNAL(clicked()), this, SLOT(add()));
connect(ui->actionSpeichern, SIGNAL(triggered()), this, SLOT(save()));
}
...
void MainWindow::add()
{
add_adress *add = new add_adress(this);
add->show();
}
void MainWindow::save()
{
...
}
Nun habe ich mir gedacht den QVector einfach dem Konstruktor der 2. Klasse als Referenz zu übergeben (&). Das scheint aber nicht zu funktionieren.
Ich bitte um Hilfe!
Grüße,
user710
Verfasst: 11. September 2010 18:56
von upsala
Scheint nicht zu funktionieren ist keine Fehlermeldung...
Und Klassen-Namen werden üblicherweise großgeschrieben (CamelCase)
Verfasst: 11. September 2010 19:19
von user710
Ok, wenn ich es al Referenz übergeben will, verlangt der Compiler einen Standartwert. Ich weiß leider nicht, wie ich den setzen soll...
Das geht will der Compiler auf jdene Fall nicht, da man in diesem Fall keine '{' verwenden kann!
Code: Alles auswählen
struct werte
{
int id;
QString vorname;
QString nachname;
QString emailadresse;
bool status;
};
namespace Ui {
class add_adress;
}
class add_adress : public QDialog
{
Q_OBJECT
public:
explicit add_adress(QWidget *parent = 0, QVector<werte> &adressen = {1, "", "", "", 0});
~add_adress();
private:
Ui::add_adress *ui;
public slots:
void add();
};
Verfasst: 11. September 2010 19:30
von Christian81
Der Compiler verlangt nur einen Standardwert wenn man dem ctor nichts übergibt. Aber warum willst Du das auf einmal machen?
Und Standardwert: QVector<werte>()
Verfasst: 11. September 2010 19:57
von user710
ohne den Standartwert kommt diese Fehlermeldung:
Code: Alles auswählen
/home/simon/workspace/notifemy-build-desktop/../notifemy/add_adress.h:26: error: default argument missing for parameter 2 of ‘add_adress::add_adress(QWidget*, QVector<werte>&)’
Vielleicht kein ANSI ist aber mit dem Qt Creator 2.0.0 so...
und dass akzeptiert er nicht:
QVector<werte>()
oder
QVector<werte> &adressen = ()
oder
QVector<werte>()&adressen
oder
QVector<werte>(&adressen)
oder
QVector<werte>&adressen = (1, "", "", "", 0)
(habe deine Syntax nicht verstanden, aber irgendeine wird's wohl sein.
Wenn es eine andere Möglichkeit gibt auf die Elemente zuzugreifen, so würde ich diese natürlich wählen...!
Übrigens habe ich es schon probiert, die Klasse rein zu kopieren und dann auf die Elemente mittels MainWindow:: zu zugreifen...
Dann kam diese Fehlermeldung:
Code: Alles auswählen
/home/?/workspace/projekt/../notifemy/mainwindow.h:28: error: object missing in reference to ‘MainWindow::adressen’
Das das nicht klappt war mir aber schon vorher klar.
Verfasst: 11. September 2010 21:30
von franzf
Deine Funktion nimmt eine nicht-konstante Referenz entgegen. Dafür muss ein nicht-temporäres Objekt existieren. Ein Default-Parameter erfüllt diese Bedingung nicht. Entweder willst du wirklich eine nicht-konstante Referenz haben, entweder um sie in einem Member zu speichern, oder der Konstruktor will das Objekt dahinter verändern. Letzteres ist nix gut, da dieser Nebeneffekt im Falle einer Exception im Konstruktor nicht zurückgenommen werden kann, deine Klasse ist nicht Exception-sicher.
Eine Alternative wäre eine konstante Referenz. Der Standard erlaubt ein temporäres Objekt als Wert für eine konstante Referenz! Ich denke auch, dass dir eigentlich eine konstante Referenz reichen sollte.
Warum du den Fehler
bekommen hast ist dir hoffentlich klar. Du musst für alle Parameter, die auf eines mit Default-Wert folgen, ebenfalls Default-Werte angeben. Wenn das erste Argument einen Default-Wert hat, das zweite aber nicht, ist das ein Fehler.
Verfasst: 12. September 2010 11:28
von user710
Also gut, ich habe es jetzt für mein Projekt effektiver gemacht und eine neue Klasse speziell für meine Daten erstellt. Diese dient nicht nur der Schnittstelle der zwei anderen Klassen sondern auch der schnellen und einfachen Datenbehandlung...
Aber eine Frage hätte ich da noch:
ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss. Wie soll das aber mit dem QT Creator 2.0 gehen?
Grüße,
user710
Verfasst: 12. September 2010 11:35
von franzf
user710 hat geschrieben:ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss.
Linker konfigurieren? Wo hast du das her? Wahrscheinlich deklarierst du die statische Variable nur, ohne sie in einer Implementierungsdatei zu definieren.
Code: Alles auswählen
// in myclass.h
class MyClass {
static int zahl;
};
// in myclass.cpp
int MyClass::zahl = 10;
Verfasst: 13. September 2010 11:44
von RHBaum
ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss. Wie soll das aber mit dem QT Creator 2.0 gehen?
Ich weiss nicht mit welchen compiler du compilierst, aber glaub alle die der Creator unterstuetzt, koennen statische variablen.
Erzaehl uns zuerst mal, wofür Du die brauchst. In den meisten Fällen sind statische Variablen ne Design-Schwaeche. Nur in selteneren Fällen haben die überhaupt ne Daseinsberechtigung. Ich bin mir fast sicher, das sich Dein Problem ohne statische variablen sauber loesen laesst !
Ciao ...
Verfasst: 13. September 2010 16:15
von user710
Ja lässt es sich ja auch, ich habe ja meinen Container in den Heap geschickt. Das man statische Variablen nicht verwendet war mir vorher nicht bekannt. Aber danke für die Auskunft...
Grüße.
Verfasst: 14. September 2010 13:51
von RHBaum
Ups, sorry, wenn man nen Tag spaeter selber liesst ....
wenn Du mit "statischen Variablen" Variablen meist, die aufn Stack anlegst .. dann ist das was ich oben geschrieben hab Müll !
Stack Variablen sind natuerlich scho ok.
meinte eher die static Geschichte, was mit Stack weniger zu tun hat.
Sorry wenn ich da fuer Konfusion gesorgt hab ....
Ciao ...