[gelöst] Signal Slot dynamisch auf UI-Objekte

Alles rund um die Programmierung mit Qt
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

[gelöst] Signal Slot dynamisch auf UI-Objekte

Beitrag von ZSchneidi »

Hi, ich bin grad beim Thema Signal/Slots angekommen und überlege gerade, wie ich es am besten hinbekomme, eine Methode zu nutzen um verschiedene Elemente zu bearbeiten, also das ganze nicht statisch schreiben zu müssen.

Ist doof zu erklären irgendwie, trotzdem versuch ichs mal.

Ich habe mehrere QLineEdit Objekte, ich möchte jeweils von einem zum dazugehörigen Partnerobjekt die Umwandlung von Dezimal auf Binär durchführen. Jetzt möchte ich aber beim Connect() nicht jedes mal eine andere Methode aufrufen müssen.

Code: Alles auswählen

QObject::connect(Bw->ui->firstqu, SIGNAL(textChanged(QString)),
                  this,  SLOT(DecToBin(QString)));
Sprich, ich möchte nicht in der "DecToBin" methode sagen dass dieses oder jenes Objekt den umgewandelten QString bekommt, sondern eher z.B. einen Pointer oder so mit übergeben, der definiert wohin der Output gehen soll, damit die methode dynamisch für alle Ein- Ausgabefelder nutzbar wird.

Ich hoffe das ist einigermaßen verständlich ausgedrückt.

Könnt ihr mir nen Tip geben, wie ich das bewerkstelligen könnte ?
Zuletzt geändert von ZSchneidi am 20. Oktober 2009 12:15, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Suchst Du vielleicht QObject::sender() ?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag von Strahlex »

Oder QSignalMapper?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

2 Möglichkeite:
QSignalmapper (ne sehr edle Sache9

Oder du mahcst dir ne "myConnect" Funktion in der du dir ein Liste deiner Input Widget holfst ( findChild<QLineEdit*>() ) durch diese Iterierst und jedes Objekt der Liste mit deiner Funktion verbindest
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Hmm die beiden gehen wohl in die richtige Richtung, aber ganz kapiert hab ich die jetz noch nicht.

Der Sender ist ein Pointer auf das auslösende Objekt, so wie ich das verstehe, was ich bräuchte wäre aber mehr was von der art Pointer auf das Objekt, an das der Slot adressieren soll.

Beispeil:

Ich hab ein Knopf1 den drücke ich, damit löse ich den Slot umrechnen() aus, jetzt will ich aber beim drücken auf Knopf1 einen Zeiger auf die Ausgabe1 übergeben, damit ich die umrechnen() methode als zwischenschritt zwischen Knopf und Ausgabe einbinden kann. So dass wenn ich auf Knopf2 drücke die umrechnen() methode diesmal auf Ausgabe2 verweist.

So dass ich umrechnen() nur einmal schreiben muss und zwischen belibige Objekte hängen kann.

Den QSignalMapper guck ich mir grad an, der wirkt noch etwas konfus auf mich.
Wenn ihr zu dem Problem vielleicht nen Beispiel kennt anhand dessen man sich die vorgehensweise mal angucken könnte, wäre das toll.

Muss ja machbar sein, ich mein wer schreibt eine Funktion mehr als einmal ?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Woran machst du es fest wohin ausgegeben werden soll?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Jetzt hab ichs glaube ich.... du hast nur einen Knopf und abhängig von in welchem LineEdit was ssteht soll die Ausgabe ins zugehörige Ausgabe LE?


Glaube nicht das das ohne weiteres möglich ist (jedenfalls nicht sauber)
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

^^ nicht ganz,
das mit dem Knopf war nur ein vereinfachenderes Beispiel, sorry wenns zur verwirrung geführt hat ^^

Genauer hab ich an sich bloß LineEdit's

8 an der Zahl in 2er Paaren.

Ich gebe im LineEdit1 eine Zahl ein und diese soll umgerechnet im LineEdit 2 erscheinen, wenn ich im LE3 was eintippe soll dieser wert entsprechend im LE4 erscheinen usw.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Die Lösung "QSignalMapper" wurde ja schon genannt... einfach
1. Beispiel anschauen: http://doc.trolltech.com/4.5/qsignalmapper.html#details
2. Ausprobieren
3. in dein Projekt einbauen..

In deinem Fall würde ich ein ident verwenden und abhängig von diesem die beiden Elemente (QLineEdits) ermitteln:

Code: Alles auswählen

void MyWidget::umrechnen(int id)
{
  QLineEdit *edt1 = list1[id]; // oder per Objekt-Namen oder sonst wie..
  QLineEdit *edt2 = list2[id]; // oder per Objekt-Namen oder sonst wie..
  ....
}
hth..
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Ok, ich dank euch erstmal, damit werd ich mich jetz erstmal beschäftigen.
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Hi, bin heute endlich mal dazu gekommen das mit dem Signalmapper zu versuchen.

Habe da aber noch dieses und jenes kleines Problem.

Soweit wie ich das jetz verstanden habe, dient mir der SignalMapper dazu.

Eine Methode über verschiedene Elemente anzusprechen, an sich kommt dass dem was ich brauche auch schon sehr nahe.

Das Problem, das ich momentan noch habe ist, dass ich der Funktion zwar mitteilen kann, wer ausgelöst hat, aber da ich keine einfachen Buttons habe reicht das noch nicht, was ich brauche ist noch die zusatzinformation "text()" aus dem LineEdit.

Wie kann ich dem Mapper jetzt klar machen, welches LE und mit welchem Text ausgelöst hat ?

Bin da noch nicht so ganz hinter gestiegen, falls das jemand hier schonmal durch hat und evtl. ansatzweise nen Tip geben kann, würde es mir die Sache etwas vereinfachen...
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

über den Button wird das schwierig...denn der Button weiss nicht was sich verändert hat.

Als alternative würde mir einfallen das du auf die Signale deiner LE hörst. Oder du speicherst dir welches LE zuletzt bearbeitet wurde (was eig. totaler Mist ist)

Oder du ignorierst alle "0" LE ....(auch mist)
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Wie meinst du das, "auf die Signale hören" ?

Irgendwie kann das doch nicht so schwer sein, ich kann mir nicht vorstellen, dass solch ein Fall so speziell sein soll, dass es dafür keine saubere Lösung gibt.

Oder wird so selten über ein LineEdit eine Methode ausgelöst ?
Bzw. über mehrere LE's ein und die selbe, die dann auch weiß von wem
sie ausgelöst wurde ...

Mir fällt jetzt auch keine wirklich saubere Lösung ein.

Google hat mir da dauch nicht wirklich bei geholfen, da die meisten Ansätze
auch auf den SignalMapper hinauslaufen.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Naja das ding ist das du es via Button machen möchtest was nicht ohne umweg geht.
Aber nen LE hat viele Signale die du nutzen kannst....schau sie dir mal an! das geht dann wunderbar aber via Button sehe ich keinen weg da der Btn niht weiss welches LE bearbeitet wurde!!!
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Hmm irgendwie reden wir noch aneinander vorbei ^^

Ich habe keine Buttons im Layout, ich signalisiere ausschließlich über die LE's.

Ich nutze das signal textchanged() der LE, um die methode aufzurufen.
Nur wie kann ich jetzt meiner Methode sagen, welches LE signalisiert hat und entsprechend auch welchen text sie dann verarbeiten soll ?

Das is ja mein Problem, ich hätte wohl nicht versuchen sollen von Buttons zu reden ; )
Antworten