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?

    s.a. Qt5 Tutorial QTimer - 2018



  • 👍 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.


Log in to reply