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:
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.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.
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();
}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_HMy 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();
}
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)