Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Auslösen von "Wanderung " eines Labels in einem Formular durch Signal clicked() eines PushButtons
Forum Updated to NodeBB v4.3 + New Features

Auslösen von "Wanderung " eines Labels in einem Formular durch Signal clicked() eines PushButtons

Scheduled Pinned Locked Moved Solved German
5 Posts 3 Posters 928 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.
  • H Offline
    H Offline
    hexenepomuk
    wrote on last edited by J.Hilk
    #1

    Dargestellt werden soll oben angegebene Wanderung von Pixel 1 bis Pixel 200 Schritt für Schritt. Durch eigenen Slot und Verbindung in main.cpp springt das Label von 1 nach 200. Wie mache ich die Zwischenschritte sichtbar? Die Schleife, die im flexlabel.cpp vorgegeben wird, nimmt die Anweisung repaint() nicht an, zumal das Formular ja dort nicht definiert ist, sondern erst in main.cpp.

    **die header-Datei**:
    #ifndef FLEXLABEL_H
    #define FLEXLABEL_H
    
    #include <QLabel>
    
    //die Klasse flexLabel erbt von QLabel
    class flexLabel : public QLabel
    {
        //das Makro Q_OBJECT
        Q_OBJECT
    
    public:
        //der Konstruktor
        flexLabel(QWidget *eltern);
    
        //die Slots
    public slots:
        //erhöht den y-Wert um 1
        void erhoeheWert();
    
    public:
        void delay();
    
    
    };
    
    #endif
    
    **die flexlabel.cpp:**
    //die Header-Datei einbinden
    #include "flexlabel.h"
    #include <iostream>
    
    
    
    //der Konstruktor
    //er ruft den Konstruktor von QLabel über eine Elementinitialisierungsliste auf und reicht das Eltern-Widget weiter
    flexLabel::flexLabel(QWidget *eltern) : QLabel(eltern)
    {
    }
    
    //der Slot erhoeheWert()
    void flexLabel::erhoeheWert()
    {
        //den aktuellen y-Wert um 1 erhöhen
        int var = 1;
        while (var <= 200)
        {
            setGeometry(50, var, 50, 15);
            this->repaint();
            var++;
        }
    }
    
    **main.cpp**:
    
    #include <QMainWindow>
    #include <QApplication>
    #include <QLabel>
    #include <QPushButton>
    
    #include "flexlabel.h"
    
    int main(int argc, char *argv[])
    {
        //eine Instanz der Klasse QApplication
        QApplication a(argc, argv);
    
        //eine Instanz der Klasse QMainWindow
        QMainWindow *hauptfenster = new QMainWindow();
    
        //die Größe des Hauptfensters
        hauptfenster->setGeometry(0, 0, 400, 300);
    
        //das Label erzeugen als Instanz der Klasse flexLabel
        flexLabel *meinLabel = new flexLabel(hauptfenster);
    
        //das Label positionieren
        meinLabel->setGeometry(50, 0, 50, 15);
    
        //den Text setzen
        meinLabel->setText("Mausi");
    
        //eine Instanz der Klasse QPushButton
        QPushButton *meinButton = new QPushButton(hauptfenster);
    
        //den PushButton positionieren
        meinButton->setGeometry(280, 260, 110, 40);
    
        //den Text setzen
        meinButton->setText("Klick mich");
    
        //die Schaltfläche mit dem Slot des Labels verbinden
        QObject::connect(meinButton, SIGNAL(clicked()), meinLabel, SLOT(erhoeheWert()));
    
    
        hauptfenster->show();
    
        return a.exec();
    }
    
    jsulmJ J.HilkJ 2 Replies Last reply
    0
    • H hexenepomuk

      Dargestellt werden soll oben angegebene Wanderung von Pixel 1 bis Pixel 200 Schritt für Schritt. Durch eigenen Slot und Verbindung in main.cpp springt das Label von 1 nach 200. Wie mache ich die Zwischenschritte sichtbar? Die Schleife, die im flexlabel.cpp vorgegeben wird, nimmt die Anweisung repaint() nicht an, zumal das Formular ja dort nicht definiert ist, sondern erst in main.cpp.

      **die header-Datei**:
      #ifndef FLEXLABEL_H
      #define FLEXLABEL_H
      
      #include <QLabel>
      
      //die Klasse flexLabel erbt von QLabel
      class flexLabel : public QLabel
      {
          //das Makro Q_OBJECT
          Q_OBJECT
      
      public:
          //der Konstruktor
          flexLabel(QWidget *eltern);
      
          //die Slots
      public slots:
          //erhöht den y-Wert um 1
          void erhoeheWert();
      
      public:
          void delay();
      
      
      };
      
      #endif
      
      **die flexlabel.cpp:**
      //die Header-Datei einbinden
      #include "flexlabel.h"
      #include <iostream>
      
      
      
      //der Konstruktor
      //er ruft den Konstruktor von QLabel über eine Elementinitialisierungsliste auf und reicht das Eltern-Widget weiter
      flexLabel::flexLabel(QWidget *eltern) : QLabel(eltern)
      {
      }
      
      //der Slot erhoeheWert()
      void flexLabel::erhoeheWert()
      {
          //den aktuellen y-Wert um 1 erhöhen
          int var = 1;
          while (var <= 200)
          {
              setGeometry(50, var, 50, 15);
              this->repaint();
              var++;
          }
      }
      
      **main.cpp**:
      
      #include <QMainWindow>
      #include <QApplication>
      #include <QLabel>
      #include <QPushButton>
      
      #include "flexlabel.h"
      
      int main(int argc, char *argv[])
      {
          //eine Instanz der Klasse QApplication
          QApplication a(argc, argv);
      
          //eine Instanz der Klasse QMainWindow
          QMainWindow *hauptfenster = new QMainWindow();
      
          //die Größe des Hauptfensters
          hauptfenster->setGeometry(0, 0, 400, 300);
      
          //das Label erzeugen als Instanz der Klasse flexLabel
          flexLabel *meinLabel = new flexLabel(hauptfenster);
      
          //das Label positionieren
          meinLabel->setGeometry(50, 0, 50, 15);
      
          //den Text setzen
          meinLabel->setText("Mausi");
      
          //eine Instanz der Klasse QPushButton
          QPushButton *meinButton = new QPushButton(hauptfenster);
      
          //den PushButton positionieren
          meinButton->setGeometry(280, 260, 110, 40);
      
          //den Text setzen
          meinButton->setText("Klick mich");
      
          //die Schaltfläche mit dem Slot des Labels verbinden
          QObject::connect(meinButton, SIGNAL(clicked()), meinLabel, SLOT(erhoeheWert()));
      
      
          hauptfenster->show();
      
          return a.exec();
      }
      
      jsulmJ Online
      jsulmJ Online
      jsulm
      Lifetime Qt Champion
      wrote on last edited by jsulm
      #2

      @hexenepomuk said in Auslösen von "Wanderung " eines Labels in einem Formular durch Signal clicked() eines PushButtons:

      springt das Label von 1 nach 200

      Ja, weil du eine Schleife hast, die die Event Loop von Qt blockiert (while (var <= 200)). So etwas macht man bei Event-Driven Frameworks wie Qt nicht! Außerdem läuft diese Schleife viel zu schnell.
      Was du machen solltest ist: benutze QTimer mit einem Timeout. Verbinde einen Slot zu dem https://doc.qt.io/qt-5/qtimer.html#timeout Signal und in diesem Slot zeichne dein Label an der nächsten Position.
      Noch eleganter ist https://doc.qt.io/qt-5/animation-overview.html

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      H 1 Reply Last reply
      2
      • H hexenepomuk

        Dargestellt werden soll oben angegebene Wanderung von Pixel 1 bis Pixel 200 Schritt für Schritt. Durch eigenen Slot und Verbindung in main.cpp springt das Label von 1 nach 200. Wie mache ich die Zwischenschritte sichtbar? Die Schleife, die im flexlabel.cpp vorgegeben wird, nimmt die Anweisung repaint() nicht an, zumal das Formular ja dort nicht definiert ist, sondern erst in main.cpp.

        **die header-Datei**:
        #ifndef FLEXLABEL_H
        #define FLEXLABEL_H
        
        #include <QLabel>
        
        //die Klasse flexLabel erbt von QLabel
        class flexLabel : public QLabel
        {
            //das Makro Q_OBJECT
            Q_OBJECT
        
        public:
            //der Konstruktor
            flexLabel(QWidget *eltern);
        
            //die Slots
        public slots:
            //erhöht den y-Wert um 1
            void erhoeheWert();
        
        public:
            void delay();
        
        
        };
        
        #endif
        
        **die flexlabel.cpp:**
        //die Header-Datei einbinden
        #include "flexlabel.h"
        #include <iostream>
        
        
        
        //der Konstruktor
        //er ruft den Konstruktor von QLabel über eine Elementinitialisierungsliste auf und reicht das Eltern-Widget weiter
        flexLabel::flexLabel(QWidget *eltern) : QLabel(eltern)
        {
        }
        
        //der Slot erhoeheWert()
        void flexLabel::erhoeheWert()
        {
            //den aktuellen y-Wert um 1 erhöhen
            int var = 1;
            while (var <= 200)
            {
                setGeometry(50, var, 50, 15);
                this->repaint();
                var++;
            }
        }
        
        **main.cpp**:
        
        #include <QMainWindow>
        #include <QApplication>
        #include <QLabel>
        #include <QPushButton>
        
        #include "flexlabel.h"
        
        int main(int argc, char *argv[])
        {
            //eine Instanz der Klasse QApplication
            QApplication a(argc, argv);
        
            //eine Instanz der Klasse QMainWindow
            QMainWindow *hauptfenster = new QMainWindow();
        
            //die Größe des Hauptfensters
            hauptfenster->setGeometry(0, 0, 400, 300);
        
            //das Label erzeugen als Instanz der Klasse flexLabel
            flexLabel *meinLabel = new flexLabel(hauptfenster);
        
            //das Label positionieren
            meinLabel->setGeometry(50, 0, 50, 15);
        
            //den Text setzen
            meinLabel->setText("Mausi");
        
            //eine Instanz der Klasse QPushButton
            QPushButton *meinButton = new QPushButton(hauptfenster);
        
            //den PushButton positionieren
            meinButton->setGeometry(280, 260, 110, 40);
        
            //den Text setzen
            meinButton->setText("Klick mich");
        
            //die Schaltfläche mit dem Slot des Labels verbinden
            QObject::connect(meinButton, SIGNAL(clicked()), meinLabel, SLOT(erhoeheWert()));
        
        
            hauptfenster->show();
        
            return a.exec();
        }
        
        J.HilkJ Offline
        J.HilkJ Offline
        J.Hilk
        Moderators
        wrote on last edited by J.Hilk
        #3

        @hexenepomuk
        Ich hab deinem Post einmal formatiert, habe um den Teil des Quellcodes ``` hinzugefügt, macht das ganze lesbarer!

        Ansonsten, @jsulm scheint den Nagel auf den Kopf getroffen zu haben :D


        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        H 1 Reply Last reply
        1
        • jsulmJ jsulm

          @hexenepomuk said in Auslösen von "Wanderung " eines Labels in einem Formular durch Signal clicked() eines PushButtons:

          springt das Label von 1 nach 200

          Ja, weil du eine Schleife hast, die die Event Loop von Qt blockiert (while (var <= 200)). So etwas macht man bei Event-Driven Frameworks wie Qt nicht! Außerdem läuft diese Schleife viel zu schnell.
          Was du machen solltest ist: benutze QTimer mit einem Timeout. Verbinde einen Slot zu dem https://doc.qt.io/qt-5/qtimer.html#timeout Signal und in diesem Slot zeichne dein Label an der nächsten Position.
          Noch eleganter ist https://doc.qt.io/qt-5/animation-overview.html

          H Offline
          H Offline
          hexenepomuk
          wrote on last edited by
          #4

          @jsulm DANKE! Bin noch dabei umzusetzen!

          1 Reply Last reply
          0
          • J.HilkJ J.Hilk

            @hexenepomuk
            Ich hab deinem Post einmal formatiert, habe um den Teil des Quellcodes ``` hinzugefügt, macht das ganze lesbarer!

            Ansonsten, @jsulm scheint den Nagel auf den Kopf getroffen zu haben :D

            H Offline
            H Offline
            hexenepomuk
            wrote on last edited by
            #5

            @J-Hilk Merci, bin noch dabei umzusetzen!

            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