Задача анимации Qt - мерцающая анимация геометрии - PullRequest
2 голосов
/ 01 мая 2011

У меня проблема с созданием простой анимации с помощью анимации Qt. У меня есть маленькое изображение, расположенное в правом нижнем углу экрана, я пытаюсь создать анимацию, которая увеличит изображение, вытянув его из верхнего левого угла изображения и вытянув его к центру экрана. Мне удалось это сделать, но очень примечательно, что qanimation заставляет его мерцать (правая граница картинки, и она не получается хорошей) Я также сделал это без анимации, но с таймером и изменением геометрии окна, но у меня была та же проблема, кажется, что она не обновляется достаточно быстро, создавая мерцание в правой границе изображения.

вот 2 примера:

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 голосов
/ 04 июня 2012

Для вашего родительского виджета и для виджета, где происходит анимация, вы можете установить этот флаг:

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

0 голосов
/ 30 апреля 2012

В настоящее время я испытываю ту же проблему с масштабированием анимации моего 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)

Даже если мерцание исчезло, анимация все еще немного прерывистая.

Если у кого-то есть лучшее решение, было бы очень признательно, если бы вы могли опубликовать его. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...