Qt 动画框架 中提到 Qt 能够动态改变一个 QObject 类的其它值以实现动画效果。

下面的代码演示如何通过重绘 QWidget 实现带动画的进度条。

// qgrprogressbar.h
#ifndef QGRPROGRESSBAR_H
#define QGRPROGRESSBAR_H
#include <QGraphicsItem>
#include <QWidget>

class QGRProgressBar : public QWidget//, public QGraphicsRectItem
{
    Q_OBJECT
    Q_PROPERTY(double value
               READ value WRITE setValue
               NOTIFY valueChanged)
public:
    QGRProgressBar(QWidget* parent = 0);

    void setValue(const double& v);
    double value() const;

    virtual void paintEvent(QPaintEvent* event);

signals:
    void valueChanged();

private:
    double m_value;
};

#endif // QGRPROGRESSBAR_H
// qgrprogressbar.cpp
#include "qgrprogressbar.h"
#include <QPainter>
#include <QDebug>

QGRProgressBar::QGRProgressBar(QWidget* parent) :
    QWidget(parent),
    m_value(0)
{

}

void QGRProgressBar::setValue(const double &v)
{
    m_value = v;
    repaint();
    emit valueChanged();
}

double QGRProgressBar::value() const
{
    return m_value;
}

void QGRProgressBar::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QRectF r(0, 0, rect().width()-1, rect().height()-1);
    painter.drawRect(r);

    int i = (double)(rect().height()) / 100 * m_value;
    QRect rv(0, rect().height()-1 - i, rect().width()-1, rect().height()-1);
    painter.fillRect(rv, QColor(255, 0, 0));

}
// mainwindow.cpp
void MainWindow::on_pushButton_clicked()
{

    QPropertyAnimation* animation = new QPropertyAnimation(ui->widget, "value") ;
    animation->setDuration(1000);

    animation->setStartValue(5);
    animation->setEndValue(50);

    animation->start();
}

运行效果如下图:

自绘动画效果

其中最关键的一点是使用 Q_PROPERTY 声明自定义的属性“value”。声明属性后就可以使用 QPropertyAnimation 动态改变它的值。

    Q_PROPERTY(double value
               READ value WRITE setValue
               NOTIFY valueChanged)

public:
    void setValue(const double& v);
    double value() const;

signals:
    void valueChanged();
QPropertyAnimation* animation = new QPropertyAnimation(ui->widget, "value");

以上代码只演示一个最简单的例子,你可以根据实际需要进行扩展。

相关文章:
Qt 动画框架

标签: Qt, Qt动画, Qt 动画

添加新评论