QPainter translate/rotate Problem mit Timer-Funktion
-
Hallo,
ich möchte die Lage eines Drehschalters (selector) durch eine schwarze Linie darstellen:
Der hier zu sehende Bildausschnitt wird über einen Interval-Timer alle 500ms mit void PaintOHP::paintEvent(QPaintEvent* event) neu gezeichnet. Je nach Zustand von std::string Current::apu soll sich die Lage der schwarzen Linie ändern (-45° nach off, 0° nach on, 45° nach start). 230,240 ist die Koordinate für den Mittelpunkt des selectors.
Der Ablauf des selectors sieht wie folgt aus: Der Startzustand ist "off", nach dem Click auf das Bild wird er zu "start" und nach 6000ms über die Funktion zu "on". Leider ist das Programmergebnis des Strichs falsch: "off" stimmt, bleibt aber 6000ms stehen und wechselt dann quasi direkt auf "on". Ich habe versucht, die "rotate"-Winkel mittels altem Zustand auf einen neuen zu berechnen, aber das Ergebnis ist immer das selbe falsche. Ich wäre sehr dankbar, wenn jemand hier im Forum den Fehler findet... Im Verdacht habe ich die Timer-Funktion (6000ms), die ich vermutlich falsch verwende. Oder das std::string Format wird in der if/else Struktur falsch interpretiert. Hier nun der relevante Code: (C++, Qt)void PaintOHP::paintEvent(QPaintEvent* event) { setUpdatesEnabled(false); painter.begin(this); //... //APU selector painter.setPen(MyColor::white); painter.drawLine(230, 240, 210, 220); painter.drawLine(230, 240, 250, 220); painter.drawLine(230, 240, 230, 212); painter.setPen(MyColor::black); painter.setBrush(MyColor::white); painter.drawEllipse(210,220,40,40); painter.setPen(MyColor::black); //Zeiger int angle1; int angle2; if (Current::apu == "off" || Current::apu == "cooldown") { angle1 = -45; angle2 = 45; } //Zeiger off else if (Current::apu == "start") { angle1 = 45; angle2 = -45; } //Zeiger start else { angle1 = 0; angle2 = 0; } //Zeiger on painter.translate(230, 240); painter.rotate(angle1); painter.translate(-230, -240); painter.drawLine(230, 240, 230, 221); painter.translate(230, 240); painter.rotate(angle2); painter.translate(-230, -240); //... painter.end(); setUpdatesEnabled(true); }
void PaintOHP::ClickAPUStartSelector() { if (Current::apu == "off" && Current::IfAnyCurrentTrue()) { Current::apu = "start"; Timer::timerSetTimeout(Current::APUStart, 6000); } }
void Timer::timerSetTimeout(std::function<void()> func, int time) { std::async(std::launch::async, [=]() { Sleep(time); func(); }); }
void Current::APUStart() { if (IfAnyCurrentTrue()) { Current::apu = "on"; } else { Current::apu = "off"; } }
-
@stefanpc81 said in QPainter translate/rotate Problem mit Timer-Funktion:
Sleep(time);
Damit blockierst Du die Qt-Eventloop!
Benutze QTimer.
-
Vielen Dank! Damit klappt jetzt alles wie gewünscht.