Auslösen von "Wanderung " eines Labels in einem Formular durch Signal clicked() eines PushButtons
-
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(); }
-
@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 -
@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