Seite 1 von 1

QGraphicsView und Update will nicht

Verfasst: 25. März 2008 17:41
von Wolv
Hi!
Ich bin nun schon einige Male über folgendes Problem gestolpert:
Ich habe mein Graphikfenster, in dem ich painten lasse und in der Bewegung stattfindet. Zwar lass ich update() wie ein Blöder, allerdings verändert sich nichts. Lediglich, wenn ich die Fenstergröße manuell ändere, kommt es zu wundersamerweiser Bewegung.

Code in Auszügen:

Code: Alles auswählen

class PeinField : public QGraphicsView

 PeinField::PeinField()
     : timerId(0)
 {
     scene = new QGraphicsScene(this);
     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
     scene->setSceneRect(-200, -200, 400, 400);
     
     setScene(scene);
     setCacheMode(CacheBackground);
     setRenderHint(QPainter::Antialiasing);
     setTransformationAnchor(AnchorUnderMouse);
     setResizeAnchor(AnchorViewCenter);


     pendelkopf = new PendelKopf(this);
     pendellinie = new PendelLinie(this);

     ...

     scene->addItem(pendellinie);          
     scene->addItem(pendelkopf);

     ...
}

void PeinField::berechnePendel(double * x, int dimension_x)
 {        
        pendelende -> setX((*pendelanfang).x() + sin(x[0]) * pendellaenge);
        pendelende -> setY((*pendelanfang).y() + cos(x[0]) * pendellaenge);
        pendelkopf -> setPos((*pendelende));
        update();
 }

Code: Alles auswählen

class MainWidget : public QWidget
{    
private:
        PeinField *pein;        
};
void MainWidget::getx(double * x, int dimension_x)
{
   pein -> berechnePendel(x, dimension_x);
}
Probiere nun schon ne ganze Weile rum, komm aber irgendwie nicht drauf...
Danke für jede Hilfe,
Wolv

Verfasst: 25. März 2008 20:10
von upsala
Was sind PendelKopf und PendelLinie für Items? Der Fehler ist dort zu suchen, ein update() ist normalerweise nicht zu machen...

Verfasst: 26. März 2008 14:14
von Wolv
PendelKopf und PendelLinie sind beides QGraphicsItem.
Habe nun update() rausgenommen und durch prepareGeometryChange() an den entsprechenden Stellen gesetzt, da mir das an anderer Stelle auch schon geholfen hatte. Es liegt wohl irgendwie noch daran, dass die boundingRect nicht mitwollen.
Die Änderungen sehen nun so aus:

Code: Alles auswählen

 void PeinField::berechnePendel(double * x, int dimension_x)
 {        
        pendelende -> setX((*pendelanfang).x() + sin(x[0]) * pendellaenge);
        pendelende -> setY((*pendelanfang).y() + cos(x[0]) * pendellaenge);
        pendelkopf -> movependelkopf((*pendelende));
 }

Code: Alles auswählen

 void PendelKopf::movependelkopf(QPointF zielpunkt)
 {
        prepareGeometryChange();
        setPos(zielpunkt);
 }
Problem bleibt aber wie oben beschrieben.

Verfasst: 26. März 2008 16:52
von upsala
Du berechnest deine boundingRectangles trotzdem falsch...

Verfasst: 31. März 2008 15:23
von Wolv
hm, wobei ich mich natürlich frage, was man an

Code: Alles auswählen

 QRectF PendelKopf::boundingRect() const
 {
     qreal adjust = 6;
     return QRectF((-pendeldurchmesser - adjust)/2, (-pendeldurchmesser - adjust)/2,
                   pendeldurchmesser + adjust, pendeldurchmesser + adjust);
 }
falsch machen kann, wenn man nur

Code: Alles auswählen

 void PendelKopf::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
 {
     painter->setPen(QPen(Qt::red));
     painter->setBrush(Qt::red);
     painter->drawEllipse(-pendeldurchmesser/2, -pendeldurchmesser/2, pendeldurchmesser, pendeldurchmesser);
 }
draufmalt...

Es ist irgendwie sehr seltsam... muss ich den für setPos() irgendwelche zusätzlichen Events abfangen? Machts das QGridLayout kaputt, in dem ich das ganze hab?
Nach meinem laienhaften Eindruck kann er einfach irgendwas nicht an der richtigen Stelle aktualisieren.