Blinkende Punkte auf einem Bild

Alles rund um die Programmierung mit Qt
Antworten
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Blinkende Punkte auf einem Bild

Beitrag von sanni »

Ich möchte in einem Bild Punkte haben, die blinken. Wie kann man das realisieren. Die Referenz über das painting habe ich gelesen, werde da aber nicht wirklich schlau draus :roll:

Sollte ich das Bild als Hintergrund auf ein Widget legen, oder sollte ich über ein PaintView gehen?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich würde es mit der QGraphicsView probieren.

Was ist eine PaintView?
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Dann gib doch mal einen Ansatz an,
ich steige da einfach nicht durch . . .
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

sanni hat geschrieben:Dann gib doch mal einen Ansatz an,
ich steige da einfach nicht durch . . .
QGraphicsView ist doch ein Ansatz oder nicht? Ok, hier noch mehr Hinweise:
*) QGraphicsEllipseItem
*) QTimeLine
*) QGraphicsItemAnimation
z.B.
Du kannst natürlich auch ein eigenes Widget implementieren und dem ein property "dotColor" geben, und dann einfach ne QPropertyAnimation drauf loslassen.

Und natürlich: Doku + Examples ;)
Sollte als Ausgangspunkt für eigene Experimente reichen.
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Das ist doch ein guter Ansatz :)
Graphikprogrammierung hatte ich noch nicht.
Ich melde mich wieder, wenn ich ausexperimentiert habe!
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Na, die Beispiele sind leider nicht wirklich brauchbar. Wenn du erstmal den Mechanismus verstehen musst, kannst du mit denen nichts anfangen. Kennt jemand von euch Material aus dem Internet, das ich mir durchlesen kann ohne dabei zu verzweifeln?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Arbeite doch erst mal die Tutorials durch.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hmmm, WAS verstehst du denn nicht?
Der prinzipielle Aufbau wird doch in allen Beispielen gezeigt:

Code: Alles auswählen

QGraphicsView* view = new QGraphicsView;
QGraphicsScene* scene = new QGraphicsScene;
view->setScene(scene);
QGraphicsEllipseItem* circle = scene->addEllipse( pos_x, pos_y, circle_diameter, circle_diameter );  // Kreis an Position (pos_x, pos_y) mit Durchmesser circle_diameter
Und wenn du noch nen pen und brush mitgibst hat das Ding gleich auch ne Farbe und nen Rand.
Ich seh leider grad, dass QGraphicsItemAnimation als deprecated markiert ist. Wie animiert man denn jetzt einfache QGraphicsItems? Ein EllipseItem ist ja leider (noch?) kein QGraphicsObject, so dass man ne QPropertyAnimation nehmen könnte.

// edit:
Ok, Animation via Qt Animation Framework:
http://doc.qt.nokia.com/4.6/animation-o ... -framework
Du willst den "brush" als Property deklarieren.
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Code: Alles auswählen

QGraphicsRectItem *pin = . . .
pin->setBush( Qt::white );

QTimeLine *timer = ...
timer->setRange( 0, 2 );

QGraphicsItemAnimation *anim = ...
anim->setItem( pin );
anim->setTimeLine( timer );
for( int ii=0; ii<=2; ii++ ){
  anim->setScaleAt( ii/2.0, ii, ii );
}

QGraphicsScene scene = ...
scene->additem( pin );

QGraphicsview *view = ...
...
timer->setLoopCount( 3 );
timer->start();
So weit habe ich das glaube ich ganz gut verstanden.
Aber warum geht der Punkt von Links oben nach Rechts unten?
Eigentlich sollte er jetzt dreimal blinken und nicht wanden oder?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

sanni hat geschrieben:Eigentlich sollte er jetzt dreimal blinken und nicht wanden oder?
Was wandert? das liegt einfach am Origin des Koordinatensystems. Du willst wahrscheinlich, dass das Zentrum des Rechtecks immer an der selben Stelle bleibt, und nicht oben links. Das musst du umrechnen, und auch noch ein setPosAt an die Animation hängen.

Im übrigen hab ich bei "blinken" nicht an skalieren gedacht, sondern dass du eine Farb-Transformation (z.B. rot->gelb->rot->...) machen willst - blinken halt.
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Die von dir beschriebene Farb-Transformation hat den Nachteil, dass man immer einen Teil des "Blinkers" sehen kann. Ich hatte mir eher vorgestellt, dass der Blinker nur aus dem "Licht" besteht. Das würde man nicht sehen, wenn der Blinker gerade 'aus' ist.

Deshalb bin ich jetzt dazu übergegangen, pin über die Methode setVisible() sichtbar zu (bzw. nicht sichtbar).

Es ergibt sich aber ein anderes Problem beim Blinken.
Das Blink-Signal folgt selber einer etwas komplexeren Struktur (kein Auto-blinken). Es ist eine Folge von unterschiedlich langen Leucht/nicht-Leucht-Perioden.
Um die zu realisieren habe ich versucht die komplexe Folge von Licht-Signalen in eine TimeLine zu legen, welche vom Timer in bestimmten Abständen gestartet wird:

Code: Alles auswählen

QTimeLine *ti = new QTimeLine( 1000, this );
connect( ti, SIGNAL( valueChanged( qreal ) ), this, SLoT( slotA( qreal ) ) );

QTimer *t = new QTimer( this );
connect( timer, SIGNAL( timerout() ), this, SLOT( slotB() ) );
timer->start( 10000 );

/*****/

slotA( qreal r ){
  if( r>0.3 ){
    pin->setVisible( false );
  }else{
    pin->setVisible( true );
  }
}


slotB(){
  ti->setLoopCount( 3 );
  ti->start();
}
Leider wird beim ti->start() von slotB() ein Speicherzugriffsfehler gemeldet, und das Programm abgebrochen. Quizfrage: Warum?
Es sind doch unterschiedliche Signale und Slots :?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

sanni hat geschrieben:Es sind doch unterschiedliche Signale und Slots :?
Und unterschiedliche Objekte! Ich nehme an die ersten Zeilen in deinem Codeabschnitt stammen aus dem Konstruktor. Schau dir mal die Gültigkeitsbereiche deiner QTimeLine* ti an.
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Beitrag von sanni »

Sind zehn Stockhiebe ausreichend? :(
Antworten