QDialoge über singnal und Slot verbinden

Alles rund um die Programmierung mit Qt
Antworten
zer0
Beiträge: 17
Registriert: 26. Februar 2008 16:14

QDialoge über singnal und Slot verbinden

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

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Außerdem denke ich, daß die Signatur von macman hier ganz angebracht ist.
zer0
Beiträge: 17
Registriert: 26. Februar 2008 16:14

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 ;)

Code: Alles auswählen

Dialog* dialog1;
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:

Code: Alles auswählen

dialog1 = new Dialog( liste, von, Argumenten );
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:

Code: Alles auswählen

Dialog2* dialog2 = new Dialog2( dialog1 );
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
zer0
Beiträge: 17
Registriert: 26. Februar 2008 16:14

Beitrag 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!
Deever
Beiträge: 90
Registriert: 9. Mai 2007 18:20

Beitrag 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
zer0
Beiträge: 17
Registriert: 26. Februar 2008 16:14

Beitrag 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!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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:

Code: Alles auswählen

{
   QLineEdit *lineEdit = new QLineEdit; 
}
zer0
Beiträge: 17
Registriert: 26. Februar 2008 16:14

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

Beitrag von Christian81 »

Ich würde sagen - fange lieber erstmal mit den Tutorial und Beispielen an.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Deever
Beiträge: 90
Registriert: 9. Mai 2007 18:20

Beitrag 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
Antworten