qt graphicsscene/view timeline



  • moin zusammen,
    ich bastle eine timeline-darstellung für graphicsscene/view.
    mein ansatz sieht im moment so aus, das ich ein image lade und dieses immer
    übermale mit einem schwarzem rechteck. das grosse problem ist um eine
    flüssige animation zu bekommen muss ich manuell die scene neuzeichnen.
    das kostest aber unheimlich performance was auf keinen fall tragbar ist.
    wie könnte ich jetzt die sache beschleunigen?
    oder hat jemand eine andere idee?

    TimeOut::TimeOut() // leitet von QGraphicsItem ab
    {
    // ...
    	m_tl.setFrameRange(0, m_Image.width()); // m_tl == QTimeLine
    
    	connect(&m_tl, SIGNAL(frameChanged(int)), this, SLOT(update(int)));
    }
    
    void TimeOut::paint(
    	QPainter* painter,
    	const QStyleOptionGraphicsItem* option,
    	QWidget* widget)
    {
    	Q_UNUSED(option);
    	Q_UNUSED(widget);
    
    	painter->save();
    	painter->drawImage(
    		QRectF(0, 0, m_Image.width(), m_Image.height()),
    		m_Image);
    
    	if (m_nFrame > 0)
    		painter->fillRect(0, 0, m_nFrame, m_Image.height(), Qt::black);
    
    	painter->restore();
    }
    
    void TimeOut::update(int frame)
    {
    	m_nFrame = frame;
    
    	scene()->update(this->boundingRect()); // hier ist das problem !!!
    }
    

    falle jemand das interesse an dem image hat -> http://www.bilder-space.de/show.php?file=16.02au0R3ADClpUl3x3.png



  • gibt es hierzu inzwischen Lösungsansätze?
    @miller_m:
    kam etwas per PN?



  • @ActiveO2
    ne halbwegs gute lösung habe ich gefunden, hier ist die source
    https://sourceforge.net/apps/trac/holdingnuts/browser/trunk/src/client/TimeOut.cpp

    leider pausiert das projekt schon ein paar wochen... (lernstress gehabt, urlaub, einfach zu gutes wetter, usw...) aber bald wird es weiter gehen 😃
    btw. per PN kam nix 😕



  • Dein Link verlangt einen Login...
    Hab mich aber über die Projektseite in das svn geklinkt.
    Die sinnvollste Performance-Steigerung führst du noch nicht durch, nämlich nur den vom QPaintEvent übergebenen rect zu malen. Wenn du bei jedem paintEvent() immer das ganze Bild malst, dauert das länger als nur ein kleines Rechteck neu zu rendern.



  • sorry, ich vergaß das man über trac nen login braucht...

    ich dachte wenn ich ihm ein cliping-rechteck angebe wird er schon nicht darüber malen, warum auch macht ja keinen sinn. das entspricht doch im wesentlichen was du meinst, oder?



  • Nö. Wenn sich Fenster überdecken, oder du mit Animationen in deiner view kleine Bereiche deiner Items überdeckst, ist der QGraphicsStylOption::exposedRect < deineClipArea. Darum ist das schon gut, wenn du es machst. Steht so aber auch in der Doku:

    QRectF QStyleOptionGraphicsItem::exposedRect

    This variable holds the exposed rectangle, in item coordinates.

    Make use of this rectangle to speed up item drawing when only parts of the item are exposed. If the whole item is exposed, this rectangle will be the same as QGraphicsItem::boundingRect().



  • Orakel-Joe schrieb:

    Dein Link verlangt einen Login...
    Hab mich aber über die Projektseite in das svn geklinkt.

    Wenn ich jetzt noch wüsste, wie ich mich über die Projektseite einlinken könnte 😉



  • Das ist der svn-trunk:
    http://holdingnuts.svn.sourceforge.net/viewvc/holdingnuts/trunk/
    Ist auch zu finden (Achtung Umwege ;)) wenn du in dem Post mit dem trac-login auf den link "Projekt" klickst, und dich über die news irgendwann wieder im svn befindest 😉



  • Orakel-Joe schrieb:

    Nö. Wenn sich Fenster überdecken, oder du mit Animationen in deiner view kleine Bereiche deiner Items überdeckst, ist der QGraphicsStylOption::exposedRect < deineClipArea. Darum ist das schon gut, wenn du es machst. Steht so aber auch in der Doku:

    QRectF QStyleOptionGraphicsItem::exposedRect

    This variable holds the exposed rectangle, in item coordinates.

    Make use of this rectangle to speed up item drawing when only parts of the item are exposed. If the whole item is exposed, this rectangle will be the same as QGraphicsItem::boundingRect().

    das habe ich nicht gefunden.... werde mir das anschauen und testen. danke


Anmelden zum Antworten