Как я могу установить таймер для того, чтобы поменять картинку в метке в Qt - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь изменить изображение на этикетке через 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 голосов
/ 25 ноября 2018

пара вещей, которые я нашел в вашем коде ..

1-й, таймер работает, но вы не получаете уведомление, потому что ваш слот update () не определен в заголовке как слот, а как методвместо этого,

, с другой стороны, ваш код кажется мне неполным, вам нужно также реализовать слот on_pushButton_clicked ...

исправить это, и таймер будет вызван, но просто как информациявам не нужно снова устанавливать интервал

timer->setInterval(timerInterval);

каждый раз, когда таймер истекает ... это значение не меняется вообще, так как вы устанавливаете его в конструкторе ...

...