GraphicsItem "blinken" lassen

Alles rund um die Programmierung mit Qt
Antworten
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

GraphicsItem "blinken" lassen

Beitrag von otternase »

Hallo

folgendes Problem:
ich möchte ein GraphicsItem in einem View "blinken" lassen, wenn es selektiert wurde. Also abwechseldn sichtbar und nicht sichtbar.

Ein möglicher Lösungsweg scheint mir einen QTimer zu starten und dann an das TimerEvent ein Auslesen der selektierten Items zu hängen mit einem setVisible(!isVisible()) für jedes Item.

Gibt es für diese Aufgabe noch eine bessere Lösung, insbesondere auch eine weniger Rechnerlast erzeugende?

Danke
Markus
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QGraphicsItemAnimation sollte für dich passen. Evtl. ableiten.
Ich hab da mal rumgespielt mit Python. Vielleicht bringts dir ja was ;)

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
from PyQt4 import Qt
import types
import sys


class Gradient:
  def __init__(self, start=Qt.QColor(Qt.Qt.black), stop=Qt.QColor(Qt.Qt.white), alpha=255):
    self.start = start
    self.stop = stop
    self.alpha = alpha

  def colorAt(self, step):
    if (step < 0.0) | (step > 1.0):
      print "Warning, step = " + str(step) + " out of range, accepted values are 0.0 <= x <= 1.0"
      if step < 0.0:
        return start
      else:
        return stop
    color = Qt.QColor()
    color.setAlpha(self.alpha)
    color.setRedF((self.start.red() + (float(self.stop.red())-float(self.start.red()))*step)/255.0)
    color.setGreenF((self.start.green() + (float(self.stop.green())-float(self.start.green()))*step)/255.0)
    color.setBlueF((self.start.blue() + (float(self.stop.blue())-float(self.start.blue()))*step)/255.0)
    return color


class HighlightAnimation (Qt.QGraphicsItemAnimation):
  def __init__(self, gradient=Gradient(), parent=None):
    Qt.QGraphicsItemAnimation.__init__(self, parent)
    self.gradient = gradient

  def setGradient(self, gradient):
    if gradient:
      self.gradient = gradient

  def beforeAnimationStep(self, step):
    self.item().setBrush(Qt.QBrush(self.gradient.colorAt(step)))



if __name__ == "__main__":
  app = Qt.QApplication(sys.argv)
  
  text = Qt.QGraphicsSimpleTextItem("B")
  text.setFont(Qt.QFont("Sans", 300))
  
  timer = Qt.QTimeLine(2500)
  timer.setFrameRange(0, 100)
  Qt.QObject.connect(timer, Qt.SIGNAL('finished()'), timer, Qt.SLOT('toggleDirection()'))
  Qt.QObject.connect(timer, Qt.SIGNAL('finished()'), timer, Qt.SLOT('start()'))
  
  animation = HighlightAnimation()
  animation.setItem(text)
  animation.setTimeLine(timer)
  animation.setGradient(Gradient(start=Qt.QColor(Qt.Qt.blue), stop=Qt.QColor(Qt.Qt.red)))
  
  for i in range(0, 100):
    animation.setTranslationAt(i/100.0, -text.boundingRect().width()/2.0, -text.boundingRect().height()/2.0)
    animation.setScaleAt(i/100.0, 1+i/100.0, 1+i/100.0)
    animation.setRotationAt(i/100.0, i*3.6)
  
  scene = Qt.QGraphicsScene()
  side = text.boundingRect().width()*2.0
  scene.setSceneRect(Qt.QRectF(-side, -side, side*2.0, side*2.0))
  scene.addItem(text)
  
  view = Qt.QGraphicsView()
  view.setScene(scene)
  view.setViewport(Qt.QGLWidget(Qt.QGLFormat(Qt.QGL.SampleBuffers)))
  view.setRenderHint(Qt.QPainter.Antialiasing)
  view.show()
  
  timer.start()
  
  sys.exit(app.exec_())
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Jedes ein und ausblenden der Items erzeugt einen Refresh und dieser kostet nun mal Rechenzeit...
Antworten