Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QPainter translate/rotate Problem mit Timer-Funktion
Forum Updated to NodeBB v4.3 + New Features

QPainter translate/rotate Problem mit Timer-Funktion

Scheduled Pinned Locked Moved Solved German
3 Posts 2 Posters 341 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    stefanpc81
    wrote on last edited by stefanpc81
    #1

    Hallo,
    ich möchte die Lage eines Drehschalters (selector) durch eine schwarze Linie darstellen:
    selector.png
    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";
    	}
    }
    
    Christian EhrlicherC 1 Reply Last reply
    0
    • S stefanpc81

      Hallo,
      ich möchte die Lage eines Drehschalters (selector) durch eine schwarze Linie darstellen:
      selector.png
      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";
      	}
      }
      
      Christian EhrlicherC Online
      Christian EhrlicherC Online
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @stefanpc81 said in QPainter translate/rotate Problem mit Timer-Funktion:

      Sleep(time);

      Damit blockierst Du die Qt-Eventloop!

      Benutze QTimer.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      1
      • S Offline
        S Offline
        stefanpc81
        wrote on last edited by
        #3

        Vielen Dank! Damit klappt jetzt alles wie gewünscht.

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved