Seite 1 von 1
[gelöst] Einem SLOT einen Wert übergeben
Verfasst: 28. Februar 2018 18:17
von navyseabear
Hallo,
ich möchte einem SLOT (meiner Klasse) einen QString übergeben.
Header-File
Cpp-File
Code: Alles auswählen
mapper = new QSignalMapper(this);
connect(ui->zk_edit, SIGNAL(returnPressed()), mapper, SLOT(map()));
mapper->setMapping(ui->zk_edit, ui->zk_edit->displayText());
connect(mapper, SIGNAL(mapped(QString)), textitem, SLOT(checkTreffer(QString)));
Meine Routine wird aufgerufen und funktioniert soweit. Leider wird aber kein Wert übergeben. Was mache ich falsch??
Tobias
Re: Einem SLOT einen Wert übergeben
Verfasst: 28. Februar 2018 20:19
von hilefoks
Moin,
Code: Alles auswählen
mapper->setMapping(ui->zk_edit, ui->zk_edit->displayText());
Du rufst hier edit->displayText() auf, das zu dieser Zeit sicherlich einen leeren String zurückgibt. Daher wird dein slot korrekt aufgerufen und zwar mit dem hier hinterlegten leeren String.
Falls du Qt5/C++11 benutzt, schlage ich etwa folgenden Code vor:
Code: Alles auswählen
connect(ui->zk_edit, &QLineEdit::returnPressed, [&]() { textitem->checkTreffer(ui->zk_edit->displayText()); });
MfG
Hilefoks
Re: Einem SLOT einen Wert übergeben
Verfasst: 1. März 2018 06:17
von navyseabear
Vielen Dank!
Funktioniert super.
Leider verstehe ich nur nicht ganz was da genau passiert. Gerade dieser Teil:
[&]() { textitem->checkTreffer(ui->zk_edit->displayText()); });
ist mir doch ziemlich unverständlich.
Könntest du mir den Teil ggf. einmal genauer erklären?
mfg
Tobias
Re: Einem SLOT einen Wert übergeben
Verfasst: 1. März 2018 12:07
von hilefoks
Das ist ein Lambda-Funktion (auch Lambda-Expression oder anonyme Funktion genannt).
Auf Deutsch und recht ausführlich werden Lambda-Funktionen in diesem PDF-Dokument beschrieben:
http://www2.in.tum.de/hp/file?fid=452
MfG
Hilefoks
Re: Einem SLOT einen Wert übergeben
Verfasst: 1. März 2018 13:58
von navyseabear
Hallo Hilefoks,
vielen Dank für den Link. Habe mir gerade das Dokument ausgedruckt und versuche alles zu verstehen.
Code: Alles auswählen
connect(ui->zk_edit, &QLineEdit::returnPressed, [&]() { textitem->checkTreffer(ui->zk_edit->displayText()); });
Also, wenn ich das jetzt richtig verstanden habe, dann stellt mir die Lamdafunktion eine Referenz
[&] auf meinen Wert in
(ui->zk_edit->displayText()) her und weist diese dann meiner Funktion
checkTreffer zu.
Meine Variante hatte demnach deswegen nicht funktioniert, weil der Wert nur zum Start einmal ausgelesen wurde und dann immer wieder bei jedem Aufruf an meine Funktion weitergegeben wurde.
Die Lambdafunktion hingegen holt sich den Wert erst dann wenn eben die Bedingung (
SIGNAL)
returnPressed eintritt.
Ich glaube ich muss mal mit der Lamdafunktion ein wenig spielen um sie vollkommen zu verstehen. Es ist doch ein etwas komplexeres Thema.
mfg
Tobias