Анимация в виджете qt на qpainter — как поставить паузу?

Подскажите, как ставить паузу между кадрами. ОС - Linux?

С помощью google натыкался на различные реализации sleep() в сети, но с их применением отображался лишь конечный результат.
Содержание qpaintwidget.cpp
#include "qpaintwidget.h"
#include <QPainter>

QPaintWidget::QPaintWidget(QWidget * parent) : QWidget(parent)
{
}

void QPaintWidget::paintEvent(QPaintEvent *) {
    QColor whitebrush = Qt::white;
    QColor blackbrush = Qt::black;
    QColor redbrush = Qt::darkRed;
    QPainterPath path;
    QPainter painter(this); // Создаём новый объект рисовальщика
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    for (int i = 0; i <= 40; i++){
        //Sleep(1000);
        painter.translate(1, 0);
        painter.setBrush(whitebrush);
        painter.drawRect(0, 0, width(), height());
        QPoint triangle[3] = {
             QPoint(180, 450),
             QPoint(220, 450),
             QPoint(200, 555),
             };
        painter.setBrush(blackbrush);
        painter.drawEllipse(10, 15, 380, 380);
        painter.setBrush(redbrush);
        painter.drawEllipse(35, 8, 330, 330);
        painter.setBrush(whitebrush);
        painter.drawEllipse(50, -5, 300, 330);
        painter.setBrush(blackbrush);
        painter.drawPolygon(triangle, 3);
        path.setFillRule(Qt::WindingFill);
        path.addRect(180, 250, 40, 200);
        path.addRect(150, 250, 100, 20);
        painter.drawPath(path);
        painter.setBrush(whitebrush);
        painter.drawEllipse(120, 260, 60, 20);
        painter.drawEllipse(220, 260, 60, 20);

}
}

  • Вопрос задан
  • 5159 просмотров
Решения вопроса 1
EXL
@EXL
Энтузиаст
Вы неправильно рисуете. Попробуйте так:

qpaintwidget.cpp:
#include "qpaintwidget.h"

#include <QPainter>
#include <QDebug>

QPaintWidget::QPaintWidget(QWidget *parent)
    : QWidget(parent)
{
    offset = 0;
    resize(800, 600);

    paintTimer = new QTimer(this);
    paintTimer->start(10);
    connect(paintTimer, SIGNAL(timeout()), this, SLOT(updatePixmap()));
}

void QPaintWidget::paintEvent(QPaintEvent *)
{
    QColor whitebrush = Qt::white;
    QColor blackbrush = Qt::black;
    QColor redbrush = Qt::darkRed;
    QPainterPath path;
    QPainter painter(this); // Создаём новый объект рисовальщика
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.translate(1 + offset, 0);
    painter.setBrush(whitebrush);
    painter.drawRect(0, 0, width(), height());
    QPoint triangle[3] = {
        QPoint(180, 450),
        QPoint(220, 450),
        QPoint(200, 555),
    };
    painter.setBrush(blackbrush);
    painter.drawEllipse(10, 15, 380, 380);
    painter.setBrush(redbrush);
    painter.drawEllipse(35, 8, 330, 330);
    painter.setBrush(whitebrush);
    painter.drawEllipse(50, -5, 300, 330);
    painter.setBrush(blackbrush);
    painter.drawPolygon(triangle, 3);
    path.setFillRule(Qt::WindingFill);
    path.addRect(180, 250, 40, 200);
    path.addRect(150, 250, 100, 20);
    painter.drawPath(path);
    painter.setBrush(whitebrush);
    painter.drawEllipse(120, 260, 60, 20);
    painter.drawEllipse(220, 260, 60, 20);
}

void QPaintWidget::updatePixmap()
{
    (offset >= 810) ? offset = 0 : offset+=5;
    qDebug() << offset;
    repaint();
}

QPaintWidget::~QPaintWidget()
{

}


qpaintwidget.h:
#ifndef QPAINTWIDGET_H
#define QPAINTWIDGET_H

#include <QWidget>
#include <QTimer>

class QPaintWidget : public QWidget
{
    Q_OBJECT

    int offset;
    QTimer *paintTimer;
protected:
    void paintEvent(QPaintEvent *);
private slots:
    void updatePixmap();
public:
    QPaintWidget(QWidget *parent = 0);
    ~QPaintWidget();
};

#endif // QPAINTWIDGET_H


И несколько советов:
1. Во-первых, никогда не используйте sleep() или Sleep() (в Windows) в программах на Qt. Так как при вызове этой функции замораживается основной thread, в котором как раз и происходит рендеринг GUI. Отсюда тормоза программы и пр.

2. Никогда не начинайте названия своих классов с буквы Q или q, так как тогда их легко спутать с теми классами, которые входят в библиотеку. Если вам так нужен префикс в имени класса, используйте заглавную C (Class), т. е. ваш класс должен иметь название CPaintWidget или просто PaintWidget.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы