[gelöst] Signal Slot dynamisch auf UI-Objekte
Was hast Du gegen die QSignalMapper-Klasse? Mit der kannst Du doch feststellen, von welchem QLineEdit das Signal ausgelöst wurde. Und wenn Du weißt, welches QLineEdit-Objekt verändert wurde, ist es doch ein leichtes, mit Hilfe der text() Methode des QLineEdit-Objektes den Text zu ermitteln.
Gruß Michael
Gruß Michael
An sich geb ich dir recht, ich hab es nur noch nicht so recht hinbekommen, das so umzusetzen.
Ich dem SignalMapper das Objekt mitgeben, in der Methode konnte ich dann nur nicht mehr auf text() zugreifen, da lief also noch n bischen was falsch.
Womit würdest du denn jetzt das LineEdit adressieren ?
Ich habs über das Objekt selbst versucht.
Ich dem SignalMapper das Objekt mitgeben, in der Methode konnte ich dann nur nicht mehr auf text() zugreifen, da lief also noch n bischen was falsch.
Womit würdest du denn jetzt das LineEdit adressieren ?
Ich habs über das Objekt selbst versucht.
Ne Liste ? Sorry da komm ich grad nicht mehr ganz mit...
Mein bisheriger Ansatz war dieser...
Davon hatte ich mir eigentlich erhofft, dass wenn ich die LineEdit ändere, dem SignalMapper mitteile, dass hier die "firstline" emitted hat und dass der das Mapping mir das Objekt des senders übergibt, dass ich dann an die Methode übergebe.
Funktioniert nur nicht, das Beispiel in der Doku macht es nur nicht wirklich verständlicher für mich.
Wo liegt hier meine Denkfehler ?
Mein bisheriger Ansatz war dieser...
Code: Alles auswählen
signalMapper = new QSignalMapper(this);
connect(firstline, SIGNAL(textChanged()),
signalMapper, SLOT(map()));
signalMapper->setMapping(firstline,firstline);
connect(signalMapper, SIGNAL(mapped(QObject*)),
this, SLOT(Calc(QObject)));
void IpAdressing::Calc(QObject uiobject)
{
...
}
Funktioniert nur nicht, das Beispiel in der Doku macht es nur nicht wirklich verständlicher für mich.
Wo liegt hier meine Denkfehler ?
Code: Alles auswählen
void IpAdressing::Calc(QObject uiobject) Code: Alles auswählen
void IpAdressing::Calc(QObject *uiobject) Code: Alles auswählen
void IpAdressing::Calc(QObject *uiobject)
{
QLineEdit *lineEdit = qobject_cast<QLineEdit *>(uiobject);
QString text=lineEdit->text();
}
Ohh unnötiger Fehler, da hätt ich auch selbst drauf kommen müssen.
Der Compiler hatte mir nur ziemlich seltsame Fehler geworfen, mit denen ich garnichts anfangen konnte, jetz nen Pointer draus gemacht und er läuft zumindest sauber durch.
Ich dank dir vielmals.
Ein Problem bleibt nun aber noch bestehen.
Wenn ich in der "firstline" eine eingabe mache, würde ich erwarten, dass das Signal in den Mapper läuft und diesen dazu bringt die Calc methode auszuführen, leider bleibt dass jedoch aus.
Wenn ich in die Calc laufe, lasse ich mir momentan eine Einfache Ausgabe machen, nur damit ich weiß, dass das programm da angekommen ist.
Zudem hab ich auch versucht mit dem Debugger herauszufinden, wo der Fehler liegen könnte, komm da aber noch zu keinem Schluss.
Gehe ich da überhaupt recht in der Annahme, dass mit dem ändern der "firstline" jetzt automatisch die Calc() methode aufrufe, oder hab ich da noch irgendwas vergessen ?
Der Compiler hatte mir nur ziemlich seltsame Fehler geworfen, mit denen ich garnichts anfangen konnte, jetz nen Pointer draus gemacht und er läuft zumindest sauber durch.
Ich dank dir vielmals.
Ein Problem bleibt nun aber noch bestehen.
Wenn ich in der "firstline" eine eingabe mache, würde ich erwarten, dass das Signal in den Mapper läuft und diesen dazu bringt die Calc methode auszuführen, leider bleibt dass jedoch aus.
Wenn ich in die Calc laufe, lasse ich mir momentan eine Einfache Ausgabe machen, nur damit ich weiß, dass das programm da angekommen ist.
Zudem hab ich auch versucht mit dem Debugger herauszufinden, wo der Fehler liegen könnte, komm da aber noch zu keinem Schluss.
Gehe ich da überhaupt recht in der Annahme, dass mit dem ändern der "firstline" jetzt automatisch die Calc() methode aufrufe, oder hab ich da noch irgendwas vergessen ?
Da ist noch ein Parameterfehler, den ich vorhin nicht gesehen habe:
Das Signal textChanged ist folgendermaßen deklariert:
Bei solchen Fehlern wird aber auch eine Meldung auf der Konsole ausgegeben.
Gruß Michael
Das Signal textChanged ist folgendermaßen deklariert:
Daher muss der Connect so aussehen:void textChanged ( const QString & text )
Code: Alles auswählen
connect(firstline, SIGNAL(textChanged(const QString &)), signalMapper, SLOT(map())); Gruß Michael
Möglich, ich hatte die änderung die mir Michael noch gesagt hatte, vorher nicht getestet, die geht ja jetzt auch.
Probleme machte jetzt nur das zweite connect.
Hab ich jetzt aber auch schon behoben. Aber scheinbar läuft der immernoch nicht in die Methode rein.
Code: Alles auswählen
connect(firstline, SIGNAL(textChanged(const QString &)),
signalMapper, SLOT(map()));
Code: Alles auswählen
connect(signalMapper, SIGNAL(mapped(QObject *)),
this, SLOT(Calc(QObject)));
Die Konsole ? Hmm da ich ja nun im QT Creator arbeite, gehe ich mal davon aus dass du die Ausgabe meinst..
Die gibt mir bis auf
Starte ...
und
beendet, Rückgabewert 0
garnichts weiter aus, vorher hatte ich immernoch n fehler wie:
Object::connect: No such slot...
da konnt ichs noch verstehen, aber jetzt scheint ja alles ok zu laufen, aber ich komm einfach nicht in die Methode.
Die gibt mir bis auf
Starte ...
und
beendet, Rückgabewert 0
garnichts weiter aus, vorher hatte ich immernoch n fehler wie:
Object::connect: No such slot...
da konnt ichs noch verstehen, aber jetzt scheint ja alles ok zu laufen, aber ich komm einfach nicht in die Methode.
Wenn das so in Deinem Quellcode steht, kann das nicht funktionieren, denn dann stimmen die Parameter von Signal und Slots wieder nicht:connect(signalMapper, SIGNAL(mapped(QObject *)),
this, SLOT(Calc(QObject)));
Code: Alles auswählen
connect(signalMapper, SIGNAL(mapped(QObject *)), this, SLOT(Calc(QObject*))); Nein deine Version, hab ich bereits im Code stehen, die andere war die, die ich davor noch hatte, klar, dass die nicht ging.
Aber an sich sollte jetz alles laufen, aber irgendwie doch nicht.
Das ist meine aktuelle Anweisung, bei der ich davon ausgehen würde, dass ich nach einer Änderung in der "firstline" das "hallo" auf der "secline" bekomme.
Das kommt nur nicht zustande.
Falls dir der Abschnitt nicht reichen sollte, kann ich dir gern mehr zeigen, is nur die Frage inwieweit alles andere da Probleme verursachen könnte.
Aber an sich sollte jetz alles laufen, aber irgendwie doch nicht.
Das ist meine aktuelle Anweisung, bei der ich davon ausgehen würde, dass ich nach einer Änderung in der "firstline" das "hallo" auf der "secline" bekomme.
Code: Alles auswählen
signalMapper = new QSignalMapper(this);
connect(firstline, SIGNAL(textChanged(const QString &)),
signalMapper, SLOT(map()));
signalMapper->setMapping(firstline,firstline);
connect(signalMapper, SIGNAL(mapped(QObject *)),
this, SLOT(Calc(QObject *)));
}
void IpAdressing::Calc(QObject *uiobject)
{
secline->setText("hallo");
}
Falls dir der Abschnitt nicht reichen sollte, kann ich dir gern mehr zeigen, is nur die Frage inwieweit alles andere da Probleme verursachen könnte.