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

Alles rund um die Programmierung mit Qt
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

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
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

mach dir doch ne Liste.... die kannst ja zB nach namen sortieren!

Sry dachte du wolltest noch via Button!
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Ne Liste ? Sorry da komm ich grad nicht mehr ganz mit...

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)
{
...
}
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 ?
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Code: Alles auswählen

void IpAdressing::Calc(QObject uiobject) 
Dein Slot hat einen falschen Parameter. Das Signal des Signalmappers hat einen Pointer als Parameter. Daher muss Dein Slot so aussehen:

Code: Alles auswählen

void IpAdressing::Calc(QObject *uiobject) 
An den Inhalt des Eingabefeldes kommst Du folgendermaßen:

Code: Alles auswählen

void IpAdressing::Calc(QObject *uiobject) 
{ 
      QLineEdit *lineEdit = qobject_cast<QLineEdit *>(uiobject);
      QString text=lineEdit->text();
} 
Gruß Michael
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

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 ?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

überflogen sieht es richtig aus!

wasliefert denn connect?

BTW: nach dem cast solltest du prüfen ob der ptr != NULL ist!
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Da ist noch ein Parameterfehler, den ich vorhin nicht gesehen habe:

Das Signal textChanged ist folgendermaßen deklariert:
void textChanged ( const QString & text )
Daher muss der Connect so aussehen:

Code: Alles auswählen

connect(firstline, SIGNAL(textChanged(const QString &)), signalMapper,  SLOT(map())); 
Bei solchen Fehlern wird aber auch eine Meldung auf der Konsole ausgegeben.

Gruß Michael
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Ok, dank dir habs grad nochmal angepasst.


@AuE :

Also laut Debugger, gab mir des connect() gerade nen false zurück, is nur die Frage wo das schief geht.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

wegen dem was dir Michael gepostet hat. Die Signal-Signatur war falsch ;-)
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Möglich, ich hatte die änderung die mir Michael noch gesagt hatte, vorher nicht getestet, die geht ja jetzt auch.

Code: Alles auswählen

connect(firstline, SIGNAL(textChanged(const QString &)),
                  signalMapper,  SLOT(map()));
Probleme machte jetzt nur das zweite connect.

Code: Alles auswählen

connect(signalMapper, SIGNAL(mapped(QObject *)),
            this, SLOT(Calc(QObject)));
Hab ich jetzt aber auch schon behoben. Aber scheinbar läuft der immernoch nicht in die Methode rein.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Was sagt die Konsole?
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

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.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

connect(signalMapper, SIGNAL(mapped(QObject *)),
this, SLOT(Calc(QObject)));
Wenn das so in Deinem Quellcode steht, kann das nicht funktionieren, denn dann stimmen die Parameter von Signal und Slots wieder nicht:

Code: Alles auswählen

connect(signalMapper, SIGNAL(mapped(QObject *)), this, SLOT(Calc(QObject*))); 
Wenn Dein Projekt nicht allzu groß ist, kannst Du es ja einmal posten. Dann kann ich mir das bei Gelegenheit einmal in Ruhe anschauen.
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

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.

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");
}
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.
Antworten