Seite 1 von 1

[gelöst]PropertyAnimation bei einem QGraphicsWidget anwenden

Verfasst: 19. September 2010 14:37
von Chris81T
Hallo,

ich bin dabei für mein Hobby Schach eine eigene Anwendung zu schreiben, um mit den engsten Bekannten ein paar Fernschach / Blitzschach- Runden zu spielen.

Das Schachbrett inkl. Figuren (nur 2D) werden mittels QGraphicsWidget abgeleiteten Klassen realisiert. Nun komm ich an den Punkt, dass ich Animationen einfügen möchte (Ausführen eines Zuges) und da hänge ich momentan etwas.

Laut Qt Doku kann man wie folgt animieren:
When you want to animate QGraphicsItems, you also use QPropertyAnimation. However, QGraphicsItem does not inherit QObject. A good solution is to subclass the graphics item you wish to animate. This class will then also inherit QObject. This way, QPropertyAnimation can be used for QGraphicsItems. The example below shows how this is done. Another possibility is to inherit QGraphicsWidget, which already is a QObject.
Ein weiteres Beispiel zur Animation hab ich auch in der Doku gefunden und es fast 1zu1 für den ersten Test übernommen (siehe Funktion doAnimation() weiter unten). Da ich "nur" die Position des Items verändern möchte, habe ich es auf die Property "pos" abgeändert.

Da ich nun nicht alles hier an Code reinposten möchte, habe ich ein Minimalbeispiel geschrieben, mit dem es genauso wenig geht.

Nutze ein mit QtCreator generiertes neues Qt GUI Application Project:
mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPropertyAnimation>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QGraphicsScene *scene = new QGraphicsScene(this);
    QGraphicsView *view = new QGraphicsView(scene, this);
    setCentralWidget(view);

    mItem = new MyItemWidget();
    mItem->setGeometry(0,0,50,50);
    scene->addItem(mItem);
}

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

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::doAnimation()
{
    QPropertyAnimation animation(mItem, "pos");
    animation.setDuration(3000);
    animation.setStartValue(QPointF(0.0, 0.0));
    animation.setEndValue(QPointF(250, 250));
    animation.setEasingCurve(QEasingCurve::OutBounce);

    animation.start();
}
My Item Header

Code: Alles auswählen

#ifndef MYITEMWIDGET_H
#define MYITEMWIDGET_H

#include <QGraphicsWidget>

class MyItemWidget : public QGraphicsWidget
{
    Q_OBJECT
    Q_PROPERTY(QPointF pos READ pos WRITE setPos)

public:
    MyItemWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
    void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 );
};

#endif // MYITEMWIDGET_H

My Item Source

Code: Alles auswählen

#include "myitemwidget.h"

#include <QPainter>

MyItemWidget::MyItemWidget(QGraphicsItem *parent, Qt::WindowFlags wFlags) :
    QGraphicsWidget(parent, wFlags)
{
}

void MyItemWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->fillRect(geometry(), Qt::red);
}

Die Funktion doAnimation() wird in der main.cpp auf dem mainwindow Object aufgerufen.

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.doAnimation();
    return a.exec();
}
Das Item wird zwar gezeichnet, aber die Animation läuft nicht.

In den Qt Demos wird meist mit Zuständen gearbeitet, was ich find, in meinem Fall mir zuviel Overhead ist, da eine simple Positionsänderung "animierend" mir erst einmal reicht.

Was habe ich übersehen?

(arbeite mit Qt 4.6.3)

Verfasst: 19. September 2010 16:05
von franzf
QGraphicsWidget hat schon ein Property namens "pos" - das kommt direkt mit QGraphicsObject (ja, properties werden vererbt ;)).

Verfasst: 19. September 2010 17:40
von Chris81T
Danke für deine Antwort und für deinen Tipp, dass die Q-Property schon gesetzt ist. Aber leider bringt mich das nun nicht zum Erfolg, oder habe deine Antw. nicht ganz verstanden?!

Im Anhang liegt auch das Bsp-Projekt.

Verfasst: 19. September 2010 17:46
von Chris81T
AAAAarrgh :twisted:

Nee, nee, dat kann ja auch nix geben. Hab die Animation ja auch nur lokal angelegt. Bevor die überhaupt was machen kann, ist se auch schon wieder vom Stack wech...

Hab mich also selbst überlistet... :oops: 8)