(gelöst) QT4.5: QGraphicsItem Update des Object auf dem Bildschirm nicht sauber



  • Hallo Zusammen,

    ich habe eine eigenes QGraphicsItem geschrieben, welches im Zeitraster von 1 Sekunde über eine QTimeLine Signal neu gezeichnet wird.

    Nur wird das Objekt nicht sauber gezeichnet. Ändere ich die Größe
    des Fenster werden die Objekte korrekt auf dem Bildschirm gezeichnet,
    da ich zu Testzwecken ein togglen des Zustandes eingebaut habe.

    Wo liegt hier mein Fehler ?

    Hier die Methode, welche das Update einleitet (+Testfunktion):

    void		StatusObject::UpdateStatus( void )
    {
    	if( m_IOState == COMPONENT_OFF)
    		m_IOState =COMPONENT_ON;
    	else
    		m_IOState = COMPONENT_OFF;
    
    	QGraphicsItem::update(QGraphicsItem::sceneBoundingRect ());
    	timeLine.start();
    }
    

    Oder muss ich das Neuzeichnen über die QGraphicsView einleiten ?

    Würde mich über eine Hilfe freuen

    Gruss



  • Ersetze

    QGraphicsItem::update(QGraphicsItem::sceneBoundingRect ());
    

    durch

    update();
    

    Das ist keine statische Methode, und auch wenn du die Methode nicht selber in StatusObject implementierst, kannst und solltest du trotzdem über this darauf zugreifen.
    Außerdem ist das rect für update() in item-Koordinaten anzugeben. sceneBoundingRect() wird auch seinen Teil zum Fehler beitragen!

    Desweiteren: Glitches beim Zeichnen (update) eines QGraphicsItem sind fast immer auf ein falsches boundingRect() zurückzuführen.
    Zeig mal die beiden entscheidenden Methoden deines StatusObject:
    * paint()
    * boundingRect()



  • Hi,

    ich habe den ersten Fehler gefunden.
    Du hattest Recht, es war die boundingRec() Routine.

    QRectF StatusObject::boundingRect() const
    {
    	QRectF		SizeOfComponent(m_XPos,m_YPos,m_width,m_height);
    
    	return		SizeOfComponent;
    }
    

    Hatte vorher (0,0,m_width,m_height); da stehen. Dachte die Abmessung sind
    wichtig, nicht der Bereich.

    Das ganze sieht jetzt schon besser aus, aber noch nicht 100%.
    Daher vermute ich, das Deine Andeutung auch für paint stimmt. 🙂

    Edit:
    So,jetzt stimmt es ganz genau. Durch eine Rotation um 90 Grad, war die boundingRect() in diesem Fall nicht korrekt.

    Danke für die Hilfe. 🙂

    Gruss


Anmelden zum Antworten