如何设置计时器以更改Qt标签中的图片

时间:2018-11-24 17:01:11

标签: qt c++11 timer qpixmap

我正在尝试将时间间隔设为12秒后更改标签中的图片。但这是行不通的,任何人都可以帮忙!该代码已附加。除此之外,由于图片很大,因此无法使用QVector< QPixmap > picArray存储图片。

有什么方法可以实现我的愿望吗?

感谢帮助!

#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

这是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;
}

这是mainwindow.cpp的代码,图片存储在资源文件(qrc)下

希望获得一些帮助!非常感谢!

1 个答案:

答案 0 :(得分:0)

我在您的代码中发现了几件事。

首先,计时器正在运行,但是您没有收到通知,因为您的slot update()不在标头中定义为slot而是方法,

另一方面,您的代码对我来说似乎不完整,您也需要实现on_pushButton_clicked插槽...

解决了该问题,定时器将被调用,但是就像信息一样,您无需再次设置时间间隔

timer->setInterval(timerInterval);

每次计时器超时...由于您在构造函数中设置了该值,因此该值根本没有改变...