Seite 1 von 1

itemChange

Verfasst: 20. November 2008 13:34
von konvex
Hallo,

ich möchte wie im Beispiel "Digramm Scene" dass sich die Linien mit den Items mit bewegen wenn ich die Items verschieben...
item.cpp

Code: Alles auswählen

QVariant EllipseItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
 if (change == QGraphicsItem::ItemPositionChange) 
   {
    foreach (LineItem *arrow, arrows) 
      {
       arrow->updatePosition();
      }
   }
    return value;
}
item.h

Code: Alles auswählen

protected:
        QVariant itemChange(GraphicsItemChange change, const QVariant &value);
private:
	QList<LineItem *> arrows;
aber mir wird dieser fehler angezeigt:
  • LineItem was not declared in this scope
    C++ forbids declaration of arrows with no type
Ich denke das Problem ist das mein Lineitem so deklariert ist:
LineItem(qreal x1, qreal y1, qreal x2, qreal y2).
ich weiß aber nicht wie ich das Problem beheben kann...

Verfasst: 20. November 2008 13:57
von Ginsengelf
Moin, hast du den Header eingebunden, in dem LineItem deklariert wird?

Ginsengelf

Verfasst: 20. November 2008 14:08
von konvex
Ja hab ich, dachte auch erst dass es daran liegt.
Ich nehm an, dass ich sowas wie

QList<LineItem(x1,y1,x2,y2) *> arrows;

hinschreiben müsste, aber das haut auch nicht hin, weil das sagt ja der Fehler eigentlich oder? Aber da kommen noch mehr Fehler...

Verfasst: 20. November 2008 15:11
von Ginsengelf
Kannst du mal die ganze item.h posten?

Ginsengelf

Verfasst: 20. November 2008 17:26
von konvex
ellipseitem.cpp

Code: Alles auswählen

#include "ellipseitem.h"
#include "lineitem.h"

EllipseItem::EllipseItem(qreal x,qreal y,qreal w,qreal h)
 	: QGraphicsEllipseItem(x,y,w,h)
{
}

EllipseItem::~EllipseItem()
{
} 

void EllipseItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
posi = e->scenePos();
setRect(posi.x()-5, posi.y()-5, 10, 10);

endi=e->scenePos();
setRect(endi.x()-5, endi.y()-5, 10, 10);
}


void EllipseItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
endi=e->scenePos();

if(scene()->itemAt(endi))
{
LineItem *linie = new LineItem(posi.x(), posi.y(), endi.x(), endi.y());
scene()->addItem(linie);
}
else
{QGraphicsEllipseItem::mouseReleaseEvent(e);}
}

QVariant EllipseItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
 if (change == QGraphicsItem::ItemPositionChange) 
  {
   foreach (LineItem *arrow, arrows) 
    {
     arrow->updatePosition();
    }
  }
 return value;
}
ellipseitem.h

Code: Alles auswählen

#include "lineitem.h"

class EllipseItem : public QGraphicsEllipseItem
{
public:
	EllipseItem(qreal x,qreal y,qreal w,qreal h);
	~EllipseItem();
protected:
	void mouseMoveEvent(QGraphicsSceneMouseEvent *e);
	void mouseReleaseEvent(QGraphicsSceneMouseEvent *e);
	QVariant itemChange(GraphicsItemChange change, const QVariant &value);
private:
	QPointF posi;
	QPointF endi;
	QList<LineItem *> arrows;
};
aber ich denk am rest dürfte nix falsch sein?!

Verfasst: 20. November 2008 18:32
von konvex
Keine Idee, was da falsch laufen könnte?
Ich find den Fehler einfach nicht.

Verfasst: 20. November 2008 20:03
von Christian81
Den Header den Ginsengelf sehen wollte hast du immer noch nicht gepostet...

Verfasst: 20. November 2008 20:53
von konvex
Na, das ist doch der header. item.h heißt bei mir ellipseitem.h

Verfasst: 20. November 2008 23:27
von Christian81
Er beschwert sich über

Code: Alles auswählen

 QList<LineItem *> arrows;
- wo ist also der Header von LineItem??

Verfasst: 21. November 2008 15:43
von konvex
Oh, sorry hab ich falsch verstanden :oops:
Ich stell gleich mal die cpp mit rein:

lineitem.h

Code: Alles auswählen

class LineItem : public QGraphicsLineItem
{
public:
	LineItem(qreal x1, qreal y1, qreal x2, qreal y2);
	~LineItem();
public slots:
	void updatePosition();
protected:
	void mouseMoveEvent(QGraphicsSceneMouseEvent *e);
	void mousePressEvent(QGraphicsSceneMouseEvent *e);
	void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
private:
	QPointF startpkt;
	QPointF endpkt;
};
lineitem.cpp

Code: Alles auswählen

LineItem::LineItem(qreal x1, qreal y1, qreal x2, qreal y2)
     : QGraphicsLineItem(x1, y1, x2, y2) {}

LineItem::~LineItem() {} 

void LineItem::mousePressEvent(QGraphicsSceneMouseEvent *e)
{ startpkt = e->scenePos(); }

void LineItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
endpkt = e->scenePos();
if(scene()->itemAt(endpkt))
{ setLine(QLineF(startpkt.x(), startpkt.y(), endpkt.x(), endpkt.y())); }
}

void LineItem::updatePosition()
 { QLineF line(startpkt.x(), startpkt.y(), endpkt.x(), endpkt.y());
    setLine(line);
 }

void LineItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
EllipseItem *myStartItem = new EllipseItem(startpkt.x(), startpkt.y(),10,10);
EllipseItem *myEndItem = new EllipseItem(endpkt.x(), endpkt.y(),10,10);

     if (myStartItem->collidesWithItem(myEndItem))
         return;
else
{ painter->drawLine(QLineF(startpkt.x(), startpkt.y(), endpkt.x(), endpkt.y())); }
}
Ist an denen etwas falsch?

Verfasst: 22. November 2008 13:21
von Christian81
Leider kann ich nichts sehen was den Fehler verursachen kann. Hast du einen include-guard in der Form

Code: Alles auswählen

#ifdef LINEITEM_H
#define LINEITEM_H
...
im Header und ist dieser ggf. in beiden Headern gleich?
Versuch mal ne Vorwärtsdeklaration
'class LineItem' vor class ElpiseItem in ellipseitem.h

Verfasst: 23. November 2008 11:51
von konvex
danke :D , das wars. Der reagiert anscheinend nicht auf #include "lineitem.h" sondern auf class LineItem;

Verfasst: 23. November 2008 11:53
von konvex
Jetzt zeigt er mir zwar keinen Fehler mehr an, aber funktionieren tuts irgendwie trotzdem nicht...