Animation mit QCanvas machen -> In Dialog darstellen



  • Guten abend erstmal,

    also ich bin schon relativ lange bei c++ dabei, aber auf Qt bin ich noch ein n00b.

    Ich will jetzt folgendes machen:
    Mein Programm gibt mir eine laaaange Liste von Koordinaten aus.
    Um jeweils ein Koordinatenpaar möchte ich einen Kreis zeichnen.
    Nach Ablauf einer (recht kurzen, so 1/10 sec vielleicht) Zeit soll dieser Kreis gelöscht und um das nächste Koordinatenpaar ein Kreis gezeichnet werden.
    Alle Koordinaten sollen durch eine Linie, also eine Art Spur verbunden werden, die aber erst dann eingezeichnet wird, wenn diese Koordinaten "dran gewesen" sind.
    Je weiter zwei aufeinanderfolgende Koordinatenpaare auseinander liegen, soll die "Spur" eine andere Farbe bekommen.

    Das ganze soll möglichst "flüssig" in einem "PixMap" oder was es da so gibt in einem Dialogfeld ausgegeben werden.

    Also ich weiß, dass es mit QCanvas möglich sein sollte, daher jetzt meine konkreten Fragen:

    Wie mach ich die "Animationsframes" mit QCanvas?
    Wie weise ich die Canvas dem Pixmap-Object zu, so dass sie sichtbar wird?
    Wie erreiche ich, dass das ganze im Dialogfeld dann wirklich wie eine Art "Film" aussieht?

    Und letztens: Ist QCanvas überhaupt die Lösung der Wahl dafür? Sollte ich doch lieber OpenGl nehmen?

    Danke für jede Art von Hilfe!



  • Okay, also so weit bin ich jetzt schon, dass man mit QCanvasView ein eigenes Widget erzeugt, und nicht ein Bild, dass man in ein PixMap schreiben kann.

    Bin wohl noch zu sehr von Delphi beeinflusst *schäm*



  • Hi PhilippM,

    Ich würde das so machen erstell ein Dialog mit ein QCanvasView drin bzw abgeleitet davon. Anschließend erstellt du beim ersten Kordinationspaar ein QEllipse (dein Kreis) das erste Koordinationspaar spiecherst du intern irgendwie anschließend beim zweiten Koordinationsppar verschiebst du nur QEllipse. Und die Entferung von der erste Koordinationspaar zum zweiten erstellt du mittels QCanvasLine mit deiner Farbe das kannst du ja einfach ausrechnen wie weit sie von einander weg sind. Dann sollte es eigentlich ziemlich flüssig aussehen.

    MfG
    xmarvel



  • QCanvas *Experiment = new QCanvas(this);
    QPainter *Painter = new QPainter();
    
    Experiment->resize(400,300);
    Experiment->setBackgroundColor(black);
    QCanvasEllipse *K1Rep = new QCanvasEllipse(50,50,Experiment);
    K1Rep->update();
    QCanvasView *Ausgabe = new QCanvasView(Experiment, this);
    Ausgabe->setGeometry(QRect(350,10,410,310));
    Ausgabe->show();
    

    Okay, jetzt wird mir eine schwarze Fläche mit komischen blau/weiß-grisseligen Rändern auf mein Dialogfeld gezeichnet, siehe Screenshot.
    Aber eine Ellipse seh ich keine!
    http://www.philippmuenzel.de/scr/Bildschirmphoto4.png



  • Aber eine Ellipse seh ich keine!

    ne kann ja auch nur nicht du musst die sachen in ein QCanvasView packen in der Reihenfolge: QCanvasView->QCanvas->QCanvasEllipse

    Hier mal ein Beispiel:

    class QDrawArea : public QCanvasView
    {
     QDrawArea( QWidget* parent=0, const char* name=0, WFlags f=0, QCanvas * canvas = new QCanvas());
    };
    
    QDrawArea::QDrawArea(QWidget* parent,const char* name, WFlags f, QCanvas * canvas) : QCanvasView (canvas, parent,name,f)
    {
     canvas->setUpdatePeriod(30);
     canvas->resize(240,128);
     canvas->setBackgroundColor(gray);
    
     QCanvasEllipse *K1Rep = new QCanvasEllipse(50,50,canvas);
     K1Rep->show();
    }
    

    MfG
    xmarvel



  • Vielen Dank für dieses Beispiel.

    Aber bei mir sieht das jetzt so aus:

    http://www.philippmuenzel.de/scr/Bildschirmphoto5.png


Anmelden zum Antworten