[gelöst]PropertyAnimation bei einem QGraphicsWidget anwenden

Alles rund um die Programmierung mit Qt
Antworten
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

[gelöst]PropertyAnimation bei einem QGraphicsWidget anwenden

Beitrag 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)
Zuletzt geändert von Chris81T am 19. September 2010 17:50, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QGraphicsWidget hat schon ein Property namens "pos" - das kommt direkt mit QGraphicsObject (ja, properties werden vererbt ;)).
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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.
Dateianhänge
GraphicsItemAnimation.zip
Qt Projekt (erstellt unter Linux)
(3.47 KiB) 187-mal heruntergeladen
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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)
Antworten