Seite 1 von 1
QDialoge über singnal und Slot verbinden
Verfasst: 26. Februar 2008 17:01
von zer0
Mein Problem ist die Verknüpfung zweier separat erstellter Dialogen miteinander zu verbinden.
In einem Dialog (Dialog1) ist ein Textfeld in dem ein Text steht, wenn ich eine Änderung an diesem Text mach "textchanged" dann soll er im Anderen Dialog (Dialog2) den Text ändern "settext".
Aber wie sage ich im connect Befehl, der in der cpp Datei von Dialog1 steht, das er den Text aus dem Textfeld von Dialog2 nehmen soll???
Danke euch schon mal ist ein super Forum!
HAbe leider keine konkrete Antwort dazu gefunden.
Verfasst: 26. Februar 2008 17:39
von Christian81
C++ Basics - ich kann nur auf ein Ojekt zugreifen auf das ich einen Pointer habe. Also muss Dialog 1 einen Pointer auf Dialog 2 haben.
Verfasst: 26. Februar 2008 18:57
von upsala
Außerdem denke ich, daß die Signatur von macman hier ganz angebracht ist.
Verfasst: 27. Februar 2008 07:23
von zer0
OK!
C++ Basics! Auch wenn es hier nicht wirklich was zu suchen hat, kannst du mir das mal kurz erklären? Also nur wie ich den Pointer mache? Bin ganz neu!
@upsala: Wer ist macman?
Verfasst: 27. Februar 2008 08:17
von franzf
zer0 hat geschrieben:Also nur wie ich den Pointer mache? Bin ganz neu!
Pointer = Zeiger. Wie man sowas bekommt sollte man schon wissen
dialog1 ist vom Typ "Zeiger auf Dialog". Allerdings kannst du damit noch nicht viel anstellen, es muss noch initialisiert werden. Das machst du mit dem oprator
new:
Nun willst du, dass der zweite Dialog was mit den Daten vom ersten anfangen soll. Dazu musst du bei der Initialisierung deinem dialog2 den Pointer auf dielog1 übergeben:
Der Konstruktor von Dialog2 muss nun den connect vom
SIGNAL Dialog::textChanged( QString ) auf
SLOT Dialog2::setText( QString ) durchführen.
Ich hoffe das ist jetzt klarer und bringt dich ein bissl weiter. Les aber BITTE trotzdem noch etwas Einführendes / Weiterführendes zu C++.
Pointer sind etwas so zentrales, dass man mit dem oben Gezeigten nicht weit kommt!
Grüße
Franz
Verfasst: 27. Februar 2008 10:13
von zer0
Das verstehe ich!
Jedoch fehlt mir jetzt die Logik!
Aus der main starte ich Dialog und Dialog2
Code: Alles auswählen
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Dialog2 dialog2;
Dialog dialog;
lauftext.show();
textfeld.show();
return app.exec();
}
in dialog2 erstelle ich ein QLineEdit
Code: Alles auswählen
Dialog2::Dialog2(QWidget *parent)
: QDialog(parent)
{
...
QLineEdit *lineEdit = new QLineEdit;
..
}
So und auf dieses lineEdit möchte ich in der Dialog.cpp ungefähr so zugreifen:
Code: Alles auswählen
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
...
connect(lineEdit, SIGNAL(textChanged(QString)),
label, SLOT(setText(QString)));
..
}
Das Signal ist natürlich nur ein Bespiel mir ist klar das ich da irgendwie Zeiger anwenden muss, aber der Zeiger muss ja auf das Textfeld in dialog2 zeigen und nicht nur auf dialog2, oder sehe ich das falsch?
Ich weiß aber leider nicht wie ich einen solchen Zeiger machen soll. habe versucht das textfeld als public in die dialog2.h zu packen und drauf zuzugreifen, jedoch geht das irgendwie nicht er nimmt den Text nicht an!
Verfasst: 27. Februar 2008 10:34
von Deever
1. Was sind 'lauftext' und 'textfeld'?
2. Vorschlag:
Code: Alles auswählen
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Dialog2 dialog2;
Dialog dialog;
dialog2.setDialog1(dialog);
dialog.setDialog2(dialog2);
[...]
return app.exec();
}
Was das werden soll, wenns fertig ist, will sich mir allerdings auch jetzt noch nicht erkennen lassen...
Gruß,
/dev
Verfasst: 27. Februar 2008 10:53
von zer0
Hubs mein Fehler.
lauftext ist dialog und textfeld ist dialog2.
Folgendes: Ich habe einen Lauftext mit dem wigglyWidget aus den Beispielen erstellt. Ursprünglich war das Textfeld im gleichen Objekt enthalten, sodass der Connect ohne Probleme funktionierte. Da ich den Lauftext über den Desktop laufen lassen will und den Text separat ändern möchte, habe ich einen zweiten Dialog erschaffen.
Also ich möchte wie schon erwähnt in dialog2 den Text eingeben und "on the fly" in dialog anpassen.
Ich könnte ja auch einfach zwei Signale verbinden, jedoch dachte ich es wäre lehrreicher (Anfänger

),wenn ich das mal über Pointer realisiere. Vielleicht checke ich dann auch mal endlich dieses Prinzip.
Was mich jetzt völlig aus der Bahn wirft ist :
Code: Alles auswählen
dialog2.setDialog1(dialog);
dialog.setDialog2(dialog2);
Nun ja jetzt wisst ihr was ich machen will! Wenn sich das nicht mit Pointern realisieren lässt, dann mach ich das mit ner Textdatei, aber das ist eigentlich nicht das was ich machen wollte!
Hat jemand eine Idee?
Ich Danke euch allen für eure Antworten!
Verfasst: 27. Februar 2008 15:07
von solarix
Code: Alles auswählen
dialog2.setDialog1(dialog);
dialog.setDialog2(dialog2);
zirkulaere Abhaengigkeiten sind nicht schoen und sollten falls moeglich vermieden werden. Aber es ist doch trotzdem nicht so schwer, die beiden Lineedits zu connecten. Dazu muesstest du doch nur die beiden dem Creator bekannt geben..:
Code: Alles auswählen
QLineEdit *edit1 = dialog1.getLineEdit();
QLineEdit *edit2 = dialog2.getLineEdit();
connect(edit1,......,edit2,....)
Oder man erstellt gemaess MVC ein Modell fuer die angezeigten Daten und teilt beiden Dialogen dieses Model mit.
Ich vermute zwar, dass du das im Code anderst gemacht hast, weise aber doch noch auf den Memory-Leak hin:
Verfasst: 28. Februar 2008 11:34
von zer0
Irgendwie verstehe ich das nicht!
Code: Alles auswählen
QLineEdit *edit1 = dialog1.getLineEdit();
QLineEdit *edit2 = dialog2.getLineEdit();
connect(edit1,......,edit2,....)
Ich soll also in der main die so bekannt machen? ers düfte ja eigentlcih reichen, wenn ich nur den LineEdit von dialog2 bekannt mache, damit ich ihn in dialog verwenden kann oder ? Aber wo mach ich das genau bekannt? ich bin jetzt voll durcheinander!
Das kann doch nicht so schwer sein bin ich so doof ?

Verfasst: 28. Februar 2008 11:39
von Christian81
Ich würde sagen - fange lieber erstmal mit den
Tutorial und
Beispielen an.
Verfasst: 28. Februar 2008 12:06
von Deever
zer0 hat geschrieben:Das kann doch nicht so schwer sein bin ich so doof ?

Das kann ich nicht beurteilen, allerdings würd ich dir empfehlen, dir die Idee mit der zirkulären Abhängigkeit aus dem Kopf zu schlagen.
Gruß,
/dev