Zugriff von Instanzvariablen über std::bind?
-
Es geht (leider) schon weiter: Ich habe in der Qwidget-Klasse "PaintLowerControls" vor, die Werte von "Engine* engineL" zum Ändern zu bringen. Ich habe das const entfernt und mein Vorhaben scheitert offenbar daran, dass ich nicht mit den Zeigern und Referenzen ( * und &) klar komme bzw. mir noch das Verständnis dazu fehlt. Irgenwie muss ich hier ein & verwenden, aber ich verstehe nicht wie bzw. wo…
PaintLowerControls.cpp
PaintLowerControls::PaintLowerControls(QWidget* parent, Engine* engineL, Engine* engineR) : QWidget(parent), engineL(engineL), engineR(engineR) { QPushButton* leverLFuel = new QPushButton(this); leverLFuel->setGeometry(QRect(65, 230, 20, 30)); leverLFuel->setStyleSheet("background-color: transparent;" "border: 0px"); connect(leverLFuel, SIGNAL(clicked()), this, SLOT(ClickFuelLeverL(engineL))); } void PaintLowerControls::ClickFuelLeverL(Engine* engineL) { if (engineL->Get_lever_fuel() == "cutoff" && Current::GetLmain()) //soll alten Wert auslesen { //folgendes soll für den ursprünglichen Instanzmember engineL geändert werden engineL->Set_lever_fuel("run"); engineL->Set_fuel_valve(true); } //… }
PaintLowerControls.h
class PaintLowerControls : public QWidget { Q_OBJECT public: PaintLowerControls(QWidget* parent, Engine* engineL, Engine* engineR); ~PaintLowerControls(); void paintEvent(QPaintEvent* event); private slots: void ClickFuelLeverL(Engine* engineL); private: Engine* engineL; Engine* engineR; };
Engine.cpp
std::string Engine::Get_lever_fuel() const { return lever_fuel; } void Engine::Set_lever_fuel(std::string s) { lever_fuel = s; }
Engine.h
//… public: std::string Get_lever_fuel() const; void Set_lever_fuel(std::string s); //…
Current::GetLmain() gibt nebenbei bemerkt ein bool zurück. Ich wäre euch dankbar, wenn auch dieses Problem hier über das Forum gelöst werden könnte.
-
Was ist denn das genaue Problem? Kompiliert es nicht?
Was ich sehe ist, daß du bei
ClickFuelLeverL(...)
engineL
als Parameter übergibst, jedoch auch ohne diesen direkt auf die Membervariable zugreifen könntest.
BeimSLOT
mußt du die Signatur angeben und die Parameter getrennt bzw. einen Lambda-Ausdruck benutzen, s. z.B. Passing an argument to a slot.Wenn du
ClickFuelLeverL
immer mit derselbenEngine
benutzt (d.h. nurengineL
und nicht auch malengineR
), dann kannst du den Parameter einfach weglassen:connect(leverLFuel, SIGNAL(clicked()), this, SLOT(ClickFuelLeverL()));
sowie
void PaintLowerControls::ClickFuelLeverL() { // ... }
-
connect(leverLFuel, &QPushButton::clicked, this, [=](){ ClickFuelLeverL(engineL); });
war die Lösung! Danke!
Für engineL und R habe ich die Funktion getrennt geschrieben, da beide eine static-variable benutzen, in deren Klasse sich nur static Variablen bzw. Funktionen zum Lesen/Schreiben dieser Variablen befinden. Sie stellen nur Zustände dar und benötigen keinen Konstruktor. Ist vielleicht nicht die gängigste Vorgehensweise aber mir schien sie mir so am einfachsten.
-
@stefanpc81 sagte in Zugriff von Instanzvariablen über std::bind?:
Ist vielleicht nicht die gängigste Vorgehensweise aber mir schien sie mir so am einfachsten.
Einfach ist nicht immer gut