QGraphicsView und Update will nicht

Alles rund um die Programmierung mit Qt
Antworten
Wolv
Beiträge: 5
Registriert: 23. März 2008 18:37

QGraphicsView und Update will nicht

Beitrag 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
Bin Anfänger und kenn mich null aus.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was sind PendelKopf und PendelLinie für Items? Der Fehler ist dort zu suchen, ein update() ist normalerweise nicht zu machen...
Wolv
Beiträge: 5
Registriert: 23. März 2008 18:37

Beitrag 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.
Bin Anfänger und kenn mich null aus.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du berechnest deine boundingRectangles trotzdem falsch...
Wolv
Beiträge: 5
Registriert: 23. März 2008 18:37

Beitrag 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.
Bin Anfänger und kenn mich null aus.
Antworten