Qt анимационный филикер - PullRequest
3 голосов
/ 12 мая 2011

Я пытаюсь оживить QGraphicsItem, но я не могу найти способ избавиться от мерцания.Элемент имеет список точек (1.000+) и рисует полилинию, составленную из этих точек (например, электрокардиограмму).Я попытался использовать двойную буферизацию (нарисовать линию на растровом изображении) и затем анимировать, но мерцание все еще есть.Вот код для элемента

Graph::Graph(float *data,int length,int frequency,QGraphicsItem *parent) : QGraphicsItem(parent),data(data)
{
    this->path = new QPainterPath();
    this->pixmap = new QPixmap(3*length,100);
    QPainter *p = new QPainter(pixmap);
    for (int i=0; i<length; i++){
        path->lineTo(3*i,data[i]);
    }
    pixmap->fill(Qt::black);
    p->setPen(Qt::white);
    p->drawPath(*path);
    setCacheMode(DeviceCoordinateCache);
}

и метод рисования

void Graph::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){

    QRectF area = option->exposedRect.toRect();
    painter->drawPixmap(area,*pixmap,area);
}

Я использую анимацию QProperty

QPropertyAnimation* animation = new QPropertyAnimation(graph, "pos");
animation->setDuration(70000);
animation->setStartValue(QPointF(0,0));
animation->setEndValue(QPointF(-1500,0));
animation->start();

Любые идеи о том, как улучшитькод

1 Ответ

0 голосов
/ 04 июня 2012

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

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

...