Search code examples
qtc++11timerqpixmap

How can I set timer in order to change the picture in the label in Qt


I'm trying to change the picture in the label after the time interval as 12s. But it won't work, can anyone please help! The code is attached. Besides that, due to the picture size is large, thus it cannot use QVector< QPixmap > picArray to store the picture.

Is there any way to realize what I wish ?

Appreciate for the help!

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QMouseEvent>
#include <QVector>
#include <QPixmap>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
     explicit MainWindow(QWidget *parent = nullptr);
     ~MainWindow();

    void mouseMoveEvent(QMouseEvent *event);

    void update();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QVector<QPixmap> picArray;
    QTimer *timer;
    int picCounter;
    int timerInterval;
};

#endif // MAINWINDOW_H

This is the code for mainwindow.h

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->lineEdit->setStyleSheet("QLineEdit {color: white;}");

    setMouseTracking(true);
    ui->centralWidget->setMouseTracking(true);

    timer = new QTimer;
    picCounter = 0;
    timerInterval = 12000;
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(timerInterval);

}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    setMouseTracking(true);
    ui->lineEdit->setText(QString(tr("move to:(%1, %2)")).arg(QString::number(event->x()), QString::number(event->y())));
}

void MainWindow::update()
{
    timer->setInterval(timerInterval);
    QPixmap p0(":/movies/ralph.png");
    QPixmap p1(":/movies/polis.png");
    QPixmap p2(":/movies/robin.png");
    if (picCounter == 0)
    {
        ui->label_2->setPixmap(p0);
        ui->label_2->setScaledContents(true);
        ui->label_2->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    }
    else if (picCounter == 1)
    {
        ui->label_2->setPixmap(p1);
        ui->label_2->setScaledContents(true);
        ui->label_2->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    }
    else if (picCounter == 2)
    {
        ui->label_2->setPixmap(p2);
        ui->label_2->setScaledContents(true);
        ui->label_2->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    }
// update picture
    picCounter++;
    if (picCounter == 3)
        picCounter = 0;
}

MainWindow::~MainWindow()
{
    delete ui;
}

This is the code for mainwindow.cpp and the picture is stored under the resource file (qrc)

Hope to get some help! Thanks a lot!


Solution

  • a couple of thing I ve found in your code..

    1st, the timer is working but you dont get the notification because your slot update() is not defined in the header as slot but as method instead,

    on the other hand, your code looks incomplete to me, you need to implement the on_pushButton_clicked slot too...

    fix that and the timer will be called, but just as info, you dont need to set the interval again

    timer->setInterval(timerInterval);
    

    every time the timer times out... that value is not changing at all since you set it in the constructor...