[gelöst] Einem SLOT einen Wert übergeben

Alles rund um die Programmierung mit Qt
Antworten
navyseabear
Beiträge: 7
Registriert: 7. Februar 2018 07:10

[gelöst] Einem SLOT einen Wert übergeben

Beitrag 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
Zuletzt geändert von navyseabear am 2. März 2018 07:30, insgesamt 1-mal geändert.
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Einem SLOT einen Wert übergeben

Beitrag 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
navyseabear
Beiträge: 7
Registriert: 7. Februar 2018 07:10

Re: Einem SLOT einen Wert übergeben

Beitrag 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
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Einem SLOT einen Wert übergeben

Beitrag 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
navyseabear
Beiträge: 7
Registriert: 7. Februar 2018 07:10

Re: Einem SLOT einen Wert übergeben

Beitrag 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
Antworten