QGraphicsView/QGraphicsScene rotierendes Rad

Alles rund um die Programmierung mit Qt
Antworten
carre
Beiträge: 15
Registriert: 28. Juni 2014 13:59

QGraphicsView/QGraphicsScene rotierendes Rad

Beitrag von carre »

Hallo,

ich brauchte ein rotierendes Rad - was mit folgenden Code Stücken möglich war:

Code: Alles auswählen

wheelWidget::wheelWidget(QWidget *parent) : QGraphicsView(parent)
{
    this->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);

//    setViewport(new QGLWidget);
    setViewport(new QOpenGLWidget);
    
    this->setViewportUpdateMode(QGraphicsView::NoViewportUpdate);

    wheel_pix = QPixmap(":/wheel.png");

    this->setOptimizationFlags(QGraphicsView::DontSavePainterState | QGraphicsView::DontAdjustForAntialiasing);
    this->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);

    this->setAttribute(Qt::WA_NoSystemBackground);

    QGraphicsScene *scene = new QGraphicsScene(this);
    scene->setItemIndexMethod(QGraphicsScene::NoIndex);
    setScene(scene);

    QLabel *rotateWheel = new QLabel();
    rotateWheel->setPixmap(wheel_pix);
    rotateWheel->setStyleSheet("background: transparent");

    QGraphicsProxyWidget *rotateWheelItem = scene->addWidget(rotateWheel);
    rotateWheelItem->setTransformOriginPoint((qreal)rotateWheel->width()/(qreal)2, (qreal)rotateWheel->height()/(qreal)2);

    rotateWheel_animation = new QPropertyAnimation(rotateWheelItem, "rotation", this);
    rotateWheel_animation->setDuration(14400); 
    rotateWheel_animation->setEasingCurve(QEasingCurve::InOutCubic);
    
    connect(this, SIGNAL(start_now_wheel()), rotateWheel_animation, SLOT(start()));
    connect(rotateWheel_animation, SIGNAL(finished()), this, SLOT(animation_wheel_finish()));
..
Die Dimension des png files ist 401*401pixel. Lasse ich die Animation laufen mit "setViewport(new QGLWidget);" ist die Animation flüssig mit ganz kleinen Unterbrechungen - also nicht ganz flüssig. Bei einem Rad sind solche Unterbrechungen leider sehr leicht sichtbar. Verwende ich "setViewport(new QOpenGLWidget);" gibt es diese kleinen Unterbrechungen nicht - solange der GUI Thread nicht mit irgendwas (SIGNAL, Event) belastet/unterbrochen wird. Laut Dokumentation soll es nicht möglich sein - Widgets in einem eigenen Thread laufen zu lassen. Was meiner Meinung aber notwendig wäre um eine flüssige unterbrechungsfreie Rotation zu erzeugen. Oder gibt es noch andere Möglichkeiten/Ideen? Die OptimizationFlags oder andere Hints haben an der Darstellung leider nichts geändert.

Gruß Thomas
Antworten