Qt动画问题 - 闪烁的几何动画

时间:2011-05-01 07:05:16

标签: qt animation timer geometry

使用Qt动画创建简单动画时遇到问题。 我有一个小图像位于屏幕的右下角,我正在尝试创建动画,通过从图像的左上角拉伸图像并将其拉伸到屏幕的中心来放大图片。 我设法做到了,但是,非常值得注意的是,qanimation使它闪烁(图片的右边界,并且结果并不好) 我也做了那个没有动画,但有一个计时器,并改变窗口几何,但我有同样的问题,似乎它不够快速刷新,在图片的右边界创建闪烁。

以下是两个例子:

1 - 使用属性动画(几何)

animation = new QPropertyAnimation(this, "geometry");
animation->setDuration(555);
animation->setEasingCurve(QEasingCurve::Linear);
animation->setStartValue(QRect(availableScreenSize.width()  -minWidth
    -WINDOW_PADDING,availableScreenSize.height() - minHeight
    -WINDOW_PADDING,minWidth,minHeight));
animation->setEndValue(QRect(availableScreenSize.width() - maxWidth
    -WINDOW_PADDING,availableScreenSize.height() - maxHeight
    -WINDOW_PADDING,maxWidth,maxHeight));

2 - 使用计时器

#include "widget.h"
#include "ui_widget.h"
#include <QDesktopWidget>
#include <QDebug>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setStyleSheet("background:transparent;");
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint
        | Qt::Tool);

    availableScreenSize = qApp->desktop()->availableGeometry();

    //Growing from right to left
    this->setGeometry(availableScreenSize.width() - 165,
        availableScreenSize.height()-95,160,90);
    //Growing from left to right
    //this->setGeometry(200,200,160,90);

    timeLine = new QTimeLine();
    timeLine->setDuration(2222);
    timeLine->setFrameRange(1, 800);
    connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(update()));

    counter = 0;

    timeLine->start();
}

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

void Widget: aintEvent(QPaintEvent * /* event */)
{
    counter++;
    qDebug() << counter;

    qApp->processEvents();
    //Growing from right to left
    this->setGeometry(availableScreenSize.width()  -165 
        - this->width()-1,availableScreenSize.height() - 95
        - this->height()-1,this->width()+1,this->height()+1);

    //Growing from left to right
    //this->setGeometry(200,200,this->width()+1,this->height()+1);

    if(timeLine->currentFrame() == 800)
    {
        qApp->exit(1);
    }
}

现在这里的热门话题是,如果动画是从右边2开始 - 它看起来很平滑......一旦方向从右边2改变,左边整个右边界都是“跳跃”。

我会批评你能给我的任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:0)

我目前遇到了与QGraphicsPixmapItem动画缩放相同的问题。与您的情况不同,我使用setScale(scaleValue)而不是setGeometry,因为该方法不适用于QGraphicsPixmapItem。我能够使用以下代码删除闪烁(注意:我正在使用PySide绑定QT,但您应该能够轻松找到相应的C ++方法):

在我的QGraphicsPixmapItem类的初始化程序中,我调用了:

self.setTransformationMode(Qt.SmoothTransformation)
self.setCacheMode(PySide.QtGui.QGraphicsItem.DeviceCoordinateCache)

在我的QGraphicsView中:

self.setCacheMode(QGraphicsView.CacheBackground)
self.setRenderHints(PySide.QtGui.QPainter.Antialiasing | PySide.QtGui.QPainter.SmoothPixmapTransform)

即使闪烁消失,动画仍然有点不稳定。

如果有人有更好的解决方案,如果你能发布它会非常感激。感谢。

答案 1 :(得分:0)

对于您的父窗口小部件以及动画发生位置的窗口小部件,您可以设置此标志:

parentWidget.setAttribute(QT :: WA_NoSystemBackground); animatingWidget.setAttribute(QT :: WA_NoSystemBackground);