QGraphicsView/QGraphicsScene rotierendes Rad
Verfasst: 10. September 2017 19:10
Hallo,
ich brauchte ein rotierendes Rad - was mit folgenden Code Stücken möglich war:
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
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()));
..
Gruß Thomas