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

Code: Alles auswählen

private:
    QSignalMapper *mapper;
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