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
- wo ist also der Header von LineItem??
Verfasst: 21. November 2008 15:43
von konvex
Oh, sorry hab ich falsch verstanden
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
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

, 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...