QTimer
-
Hi,
ich habe ein Fenster mit einem Label.
Das Label soll nach 5 Sekunden den Text ändern.mainwindow.h:
(die Zeilen 21-23 sind relevant)#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QTimer* T1; void time(); void change(); }; #endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); T1 = new QTimer(this); time(); connect(T1, SIGNAL(timeout()), SLOT(change())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::time() { T1->start(5000); } void MainWindow::change() { ui->label->setText("Neuer Text"); }
Ich erwarte eigentlich, dass sich der Text nach 5 Sekunden ändert.
Das geschieht aber nicht.
Ich vermute den Fehler in mainwindow.cpp Zeile 11.
-
Muss es nicht noch den
this
-Parameter haben?connect(T1, SIGNAL(timeout()), this, SLOT(change()));
Und wohl noch
private slots:
in der Headerdatei hinzufügen?
-
Vielen Dank!
Es funktioniert wenn ich private slots in der Headerdatei hinzufüge.
Sowohl mit dem this-Parameter, als auch ohne.
Die Lösung ist also:mainwindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QTimer* T1; void time(); private slots: void change(); }; #endif // MAINWINDOW_H
-
Man kann mit Qt 5 auch Memberfunktionen und Funktoren mit Signalen verbinden. Dann wird zur Compilezeit festgestellt, ob ein Slot existiert. Siehe auch https://doc.qt.io/qt-5/signalsandslots-syntaxes.html#
QObject::connect liefert ein QMetaObject::Connection. Damit kann man überprüfen, ob etwas verbunden werden konnte.
-
Wenn du es nur einmalig brauchst, gibt es dafür in QT:
QTimer::singleShot( 5000, this, SLOT( myTimerSlot() );
Die Funktion ist static und schickt dir nach genau 5 Sekunden ein Signal. Du brauchst also kein QTimer-Objekt erzeugen.