Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Einbinden von Timer über Auto-Connect
Forum Updated to NodeBB v4.3 + New Features

Einbinden von Timer über Auto-Connect

Scheduled Pinned Locked Moved Solved German
13 Posts 2 Posters 5.1k Views 1 Watching
  • 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
    steevie
    wrote on last edited by
    #3

    Danke für die Antwort,
    ich habe es schon unter "public slots" gesetzt, aber ich habe keine eigene Klasse für den Timer erstellt.
    Mir ist gesagt worden, dass das nicht nötig wäre, und ich einfach von QTimer ein Objekt über einen Pointer erzeugen soll.
    Das ist in meinem Fall "myTimer".
    Den Slot erstelle ich in der Klasse "MainWindow"
    Aber dann klappt das mit dem Slot nicht (jedenfalls bei mir nicht).
    Oder ist es doch einfacher, eine eigene Klasse für den Timer zu erstellen, um mit dem Slot weniger Probleme zu haben?

    Danke schon im Voraus

    Stephan

    K 1 Reply Last reply
    0
    • S steevie

      Danke für die Antwort,
      ich habe es schon unter "public slots" gesetzt, aber ich habe keine eigene Klasse für den Timer erstellt.
      Mir ist gesagt worden, dass das nicht nötig wäre, und ich einfach von QTimer ein Objekt über einen Pointer erzeugen soll.
      Das ist in meinem Fall "myTimer".
      Den Slot erstelle ich in der Klasse "MainWindow"
      Aber dann klappt das mit dem Slot nicht (jedenfalls bei mir nicht).
      Oder ist es doch einfacher, eine eigene Klasse für den Timer zu erstellen, um mit dem Slot weniger Probleme zu haben?

      Danke schon im Voraus

      Stephan

      K Offline
      K Offline
      koahnig
      wrote on last edited by
      #4

      @steevie

      Ändere

            QObject::connect(myTimer, SIGNAL(timeout()), zeichenLabel, SLOT(zeichne()));
      

      nach

            connect(myTimer, SIGNAL(timeout()), this, SLOT(zeichne()));
      

      Ich habe nicht genau gelesen. "zeichenLabel" ist ja wohl nur ein QLabel und "zeichne()" ist ein Member von MainWindow.
      Eventuell ist die Functor-basierende Schreibweise besser hier.

            connect(myTimer, &QTimer::timeout, this, &MainWindow::zeichne );
      

      Damit hättest du schon einen Fehler beim Kompilieren erzeugt.

      Vote the answer(s) that helped you to solve your issue(s)

      1 Reply Last reply
      1
      • S Offline
        S Offline
        steevie
        wrote on last edited by
        #5

        Danke,
        das mit "this" hatte ich schon probiert, jetzt noch mal, aber das Programm stürzt ab.

        bei der zweiten Version habe ich sofort einen fatalen Fehler (mit dem roten Kreuz) und das Programm schmiert ab.
        Die Syntax wird vom Programm akzeptiert, aber im Speicherbereich haue ich wahrscheinlich alles kaputt.
        Ich versuchs weiter.

        Steevie

        K 1 Reply Last reply
        0
        • S steevie

          Danke,
          das mit "this" hatte ich schon probiert, jetzt noch mal, aber das Programm stürzt ab.

          bei der zweiten Version habe ich sofort einen fatalen Fehler (mit dem roten Kreuz) und das Programm schmiert ab.
          Die Syntax wird vom Programm akzeptiert, aber im Speicherbereich haue ich wahrscheinlich alles kaputt.
          Ich versuchs weiter.

          Steevie

          K Offline
          K Offline
          koahnig
          wrote on last edited by
          #6

          @steevie

          Du kannst dies mit dem Debugger prüfen wann das Ganze abstürzt. Dies ist meist die beste Lösung.
          Ich gehe davon aus, dass du die Pointer für myTimer und zeichenLabel in der deklaration vereinbart hast.
          Desweiteren hast du noch ein paar Gross-/Kleinschreibungsfehler in er letzten Zeile:

          void MainWindow::zeichne()
          {
                if (myTimer->isActive())
                      zeichenLAbel_>setText("Hallo");
          

          Allerdings sollte dies beim Kompilieren schon auffallen.

          Vote the answer(s) that helped you to solve your issue(s)

          1 Reply Last reply
          0
          • S Offline
            S Offline
            steevie
            wrote on last edited by VRonin
            #7

            Da ich alles nur getippt habe, kann die Groß/Kleinschreibung schon mal daneben sein, aber da meckert Qr ja gleich :-)
            Hier masl der Code aus der Header-Datei:

            #ifndef MAINWINDOW_H
            #define MAINWINDOW_H
            
            #include <QMainWindow>
            #include <QLabel>
            #include <QTimer>
            #include <QPainter>
            
            namespace Ui {
            class MainWindow;
            }
            
            class MainWindow : public QMainWindow
            {
                Q_OBJECT
                
            public:
                explicit MainWindow(QWidget *parent = 0);
                ~MainWindow();
            
            QLabel *zeichenLabel;
            QTimer *myTimer;
            QPainter *myPainter;
            QPixmap *myPixmap;
            
            
            public slots:
            void zeichne();
            
                
            private:
                Ui::MainWindow *ui;
            };
            
            #endif // MAINWINDOW_H
            
            
            und dann gleich noch die Main:
            
            #include "mainwindow.h"
            #include <QApplication>
            
            int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
                MainWindow w;
                w.show();
                
                return a.exec();
            }
            

            Ich hatte es vorher noch komplexer und habe noch einen "QPaintEvent" mit eingebunden (und das Zeichnen hat ja auch geklappt), nur mit dem Timer nicht. Und dann habe ich alles rausgeschmissen, was nicht zum Timer gehört, um erst einmal das Problem zu lösen, um dann einen funktioniereden Slot vom Timer zu erzeugen, in dem ich dann das Zeichnen übernehmen kann.

            Der Absturz kommt gleich in der connect-Anweisung.

            Danke für die Hilfe bisher.
            Ich versuchs weiter.

            Steevie

            K 1 Reply Last reply
            0
            • S steevie

              Da ich alles nur getippt habe, kann die Groß/Kleinschreibung schon mal daneben sein, aber da meckert Qr ja gleich :-)
              Hier masl der Code aus der Header-Datei:

              #ifndef MAINWINDOW_H
              #define MAINWINDOW_H
              
              #include <QMainWindow>
              #include <QLabel>
              #include <QTimer>
              #include <QPainter>
              
              namespace Ui {
              class MainWindow;
              }
              
              class MainWindow : public QMainWindow
              {
                  Q_OBJECT
                  
              public:
                  explicit MainWindow(QWidget *parent = 0);
                  ~MainWindow();
              
              QLabel *zeichenLabel;
              QTimer *myTimer;
              QPainter *myPainter;
              QPixmap *myPixmap;
              
              
              public slots:
              void zeichne();
              
                  
              private:
                  Ui::MainWindow *ui;
              };
              
              #endif // MAINWINDOW_H
              
              
              und dann gleich noch die Main:
              
              #include "mainwindow.h"
              #include <QApplication>
              
              int main(int argc, char *argv[])
              {
                  QApplication a(argc, argv);
                  MainWindow w;
                  w.show();
                  
                  return a.exec();
              }
              

              Ich hatte es vorher noch komplexer und habe noch einen "QPaintEvent" mit eingebunden (und das Zeichnen hat ja auch geklappt), nur mit dem Timer nicht. Und dann habe ich alles rausgeschmissen, was nicht zum Timer gehört, um erst einmal das Problem zu lösen, um dann einen funktioniereden Slot vom Timer zu erzeugen, in dem ich dann das Zeichnen übernehmen kann.

              Der Absturz kommt gleich in der connect-Anweisung.

              Danke für die Hilfe bisher.
              Ich versuchs weiter.

              Steevie

              K Offline
              K Offline
              koahnig
              wrote on last edited by
              #8

              @steevie

              Starte vielleicht erst den Timer nach dem connect. Kann mir aber nicht direkt vorstellen, warum das ein Problem sein sollte.
              Im Debugger könnte vielleicht das connect mit dem Auslösen des Timer kollidieren.

              Ansonsten noch einmal "run qmake" und rebuild.

              Vote the answer(s) that helped you to solve your issue(s)

              S 1 Reply Last reply
              0
              • K koahnig

                @steevie

                Starte vielleicht erst den Timer nach dem connect. Kann mir aber nicht direkt vorstellen, warum das ein Problem sein sollte.
                Im Debugger könnte vielleicht das connect mit dem Auslösen des Timer kollidieren.

                Ansonsten noch einmal "run qmake" und rebuild.

                S Offline
                S Offline
                steevie
                wrote on last edited by koahnig
                #9

                @koahnig

                Also Qmake und rebuild habe ich ein paar mal gemacht
                Jetzt habe ich eine neue Klasse für den Timer gebildet, und der Timer funktioniert jetzt. Ich kann ihn starten, aber jetzt geht das Einbinden der Zeichenfunktion nicht.
                Den QPaintEvent kann ich als Funktion ja nicht in einen Slot integrieren, ob ohne den Pain Event kann ich den Painter nicht starten.
                Irgendwelche Tipps?

                Hier die Header-Datei:

                #ifndef MEINTIMER_H
                #define MEINTIMER_H
                
                #include <QtCore>
                #include <QWidget>
                #include <QtGui>
                #include <QApplication>
                
                class MeinTimer : public QWidget
                {
                    Q_OBJECT
                
                public:
                
                    QPainter *myPainter;
                    int zeitDauer;
                    int bleibendeZeit;
                    int anzahl;
                    int x ;
                    int y;
                    int hoehe;
                    int breite;
                
                    MeinTimer();
                    QTimer *kreisTimer;
                
                    //die Funktionen
                    void kreisTimerAktiv();
                    void kreisTimerStart();
                    void kreisTimerStop();
                
                public slots:
                    void kreisTimerSlot();
                
                protected:
                    void paintEvent(QPaintEvent *);
                };
                #endif // MEINTIMER_H
                

                und die cpp:

                #include "meintimer.h"
                #include <QtCore>
                #include <QDebug>
                #include <QPainter>
                #include <QApplication>
                #include <QtWidgets>
                
                MeinTimer::MeinTimer()
                {
                    resize(750, 750);
                    setWindowTitle("Kreisbewegung");
                
                    myPainter = new QPainter(this);
                    x = 10;
                    y = 10;
                    hoehe = 100;
                    breite = 100;
                
                    zeitDauer = 2000;
                    anzahl = 0;
                    kreisTimer = new QTimer(this);
                
                    connect(kreisTimer, SIGNAL(timeout()), this, SLOT(kreisTimerSlot()));
                    kreisTimer->setInterval(zeitDauer);
                    kreisTimer->start();
                
                    bleibendeZeit = kreisTimer->remainingTime();
                    qDebug() << "bleibende Zeit: " << bleibendeZeit ;
                }
                
                void MeinTimer::kreisTimerAktiv()
                {
                    if(kreisTimer->isActive())
                    {
                        anzahl = anzahl + 1;
                        x = x + 5;
                        y = y + 5;
                
                        qDebug() << "Timer arbeitet" << anzahl;
                    }
                }
                
                void MeinTimer::paintEvent(QPaintEvent *)
                {
                   myPainter->begin(this);
                
                   myPainter->drawRect(x, y, hoehe, breite);
                }
                
                void MeinTimer::kreisTimerSlot()
                {
                    qDebug() << "Timer ausgeführt";
                
                    kreisTimerAktiv();
                }
                
                void MeinTimer::kreisTimerStart()
                {
                    kreisTimer->start();
                }
                
                void MeinTimer::kreisTimerStop()
                {
                    kreisTimer->stop();
                }
                

                und noch die Main:

                #include <QApplication>
                #include "meintimer.h"
                
                int main(int argc, char *argv[])
                {
                    QApplication a(argc, argv);
                    MeinTimer w;
                    MeinTimer mTimer;
                
                    w.show();
                    
                    return a.exec();
                }
                

                Wenn ich in der Funktion PaintEvent zeichen, geht das, aber dann kann ich die Koordinaten nicht verändern, die ich mit dem Timer verändern will.
                Wenn ich im TimerSlot zeichznen möchte, dann startet der Painter nicht.
                Jetzt gehe ich schlafen und schau mir das morgen noch mal an.

                Übrigens: Allen ein gutes Neues JAhr 2017

                Steevie

                [edit: koahnig codetags added]

                K 1 Reply Last reply
                0
                • S steevie

                  @koahnig

                  Also Qmake und rebuild habe ich ein paar mal gemacht
                  Jetzt habe ich eine neue Klasse für den Timer gebildet, und der Timer funktioniert jetzt. Ich kann ihn starten, aber jetzt geht das Einbinden der Zeichenfunktion nicht.
                  Den QPaintEvent kann ich als Funktion ja nicht in einen Slot integrieren, ob ohne den Pain Event kann ich den Painter nicht starten.
                  Irgendwelche Tipps?

                  Hier die Header-Datei:

                  #ifndef MEINTIMER_H
                  #define MEINTIMER_H
                  
                  #include <QtCore>
                  #include <QWidget>
                  #include <QtGui>
                  #include <QApplication>
                  
                  class MeinTimer : public QWidget
                  {
                      Q_OBJECT
                  
                  public:
                  
                      QPainter *myPainter;
                      int zeitDauer;
                      int bleibendeZeit;
                      int anzahl;
                      int x ;
                      int y;
                      int hoehe;
                      int breite;
                  
                      MeinTimer();
                      QTimer *kreisTimer;
                  
                      //die Funktionen
                      void kreisTimerAktiv();
                      void kreisTimerStart();
                      void kreisTimerStop();
                  
                  public slots:
                      void kreisTimerSlot();
                  
                  protected:
                      void paintEvent(QPaintEvent *);
                  };
                  #endif // MEINTIMER_H
                  

                  und die cpp:

                  #include "meintimer.h"
                  #include <QtCore>
                  #include <QDebug>
                  #include <QPainter>
                  #include <QApplication>
                  #include <QtWidgets>
                  
                  MeinTimer::MeinTimer()
                  {
                      resize(750, 750);
                      setWindowTitle("Kreisbewegung");
                  
                      myPainter = new QPainter(this);
                      x = 10;
                      y = 10;
                      hoehe = 100;
                      breite = 100;
                  
                      zeitDauer = 2000;
                      anzahl = 0;
                      kreisTimer = new QTimer(this);
                  
                      connect(kreisTimer, SIGNAL(timeout()), this, SLOT(kreisTimerSlot()));
                      kreisTimer->setInterval(zeitDauer);
                      kreisTimer->start();
                  
                      bleibendeZeit = kreisTimer->remainingTime();
                      qDebug() << "bleibende Zeit: " << bleibendeZeit ;
                  }
                  
                  void MeinTimer::kreisTimerAktiv()
                  {
                      if(kreisTimer->isActive())
                      {
                          anzahl = anzahl + 1;
                          x = x + 5;
                          y = y + 5;
                  
                          qDebug() << "Timer arbeitet" << anzahl;
                      }
                  }
                  
                  void MeinTimer::paintEvent(QPaintEvent *)
                  {
                     myPainter->begin(this);
                  
                     myPainter->drawRect(x, y, hoehe, breite);
                  }
                  
                  void MeinTimer::kreisTimerSlot()
                  {
                      qDebug() << "Timer ausgeführt";
                  
                      kreisTimerAktiv();
                  }
                  
                  void MeinTimer::kreisTimerStart()
                  {
                      kreisTimer->start();
                  }
                  
                  void MeinTimer::kreisTimerStop()
                  {
                      kreisTimer->stop();
                  }
                  

                  und noch die Main:

                  #include <QApplication>
                  #include "meintimer.h"
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication a(argc, argv);
                      MeinTimer w;
                      MeinTimer mTimer;
                  
                      w.show();
                      
                      return a.exec();
                  }
                  

                  Wenn ich in der Funktion PaintEvent zeichen, geht das, aber dann kann ich die Koordinaten nicht verändern, die ich mit dem Timer verändern will.
                  Wenn ich im TimerSlot zeichznen möchte, dann startet der Painter nicht.
                  Jetzt gehe ich schlafen und schau mir das morgen noch mal an.

                  Übrigens: Allen ein gutes Neues JAhr 2017

                  Steevie

                  [edit: koahnig codetags added]

                  K Offline
                  K Offline
                  koahnig
                  wrote on last edited by
                  #10

                  @steevie

                  Versuche es einmal mit einem repaint oder update in der Timer-Slot-Routine

                  Vote the answer(s) that helped you to solve your issue(s)

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    steevie
                    wrote on last edited by
                    #11

                    Danke,

                    der Tip war Gold wert.!!
                    Jetzt bewegt sich was!
                    Von hier aus kann ich weitermachen.
                    Wenn alles funktioniert gebe ich Bescheid!

                    Steevie

                    S 1 Reply Last reply
                    0
                    • S steevie

                      Danke,

                      der Tip war Gold wert.!!
                      Jetzt bewegt sich was!
                      Von hier aus kann ich weitermachen.
                      Wenn alles funktioniert gebe ich Bescheid!

                      Steevie

                      S Offline
                      S Offline
                      steevie
                      wrote on last edited by
                      #12

                      @steevie said in Einbinden von Timer über Auto-Connect:

                      Danke,

                      der Tip war Gold wert.!!
                      Jetzt bewegt sich was!
                      Von hier aus kann ich weitermachen.
                      Wenn alles funktioniert gebe ich Bescheid!

                      Steevie

                      Also es funktioniert, und ich möchte mich herzlich bedanken

                      Steevie

                      K 1 Reply Last reply
                      0
                      • S steevie

                        @steevie said in Einbinden von Timer über Auto-Connect:

                        Danke,

                        der Tip war Gold wert.!!
                        Jetzt bewegt sich was!
                        Von hier aus kann ich weitermachen.
                        Wenn alles funktioniert gebe ich Bescheid!

                        Steevie

                        Also es funktioniert, und ich möchte mich herzlich bedanken

                        Steevie

                        K Offline
                        K Offline
                        koahnig
                        wrote on last edited by
                        #13

                        @steevie

                        Gern geschehen. Schön zu wissen, dass es geholfen hat.

                        Vote the answer(s) that helped you to solve your issue(s)

                        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