itemChange

Alles rund um die Programmierung mit Qt
Antworten
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

itemChange

Beitrag 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...
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Moin, hast du den Header eingebunden, in dem LineItem deklariert wird?

Ginsengelf
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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...
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Kannst du mal die ganze item.h posten?

Ginsengelf
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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?!
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag von konvex »

Keine Idee, was da falsch laufen könnte?
Ich find den Fehler einfach nicht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Den Header den Ginsengelf sehen wollte hast du immer noch nicht gepostet...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag von konvex »

Na, das ist doch der header. item.h heißt bei mir ellipseitem.h
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Er beschwert sich über

Code: Alles auswählen

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag von konvex »

danke :D , das wars. Der reagiert anscheinend nicht auf #include "lineitem.h" sondern auf class LineItem;
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag von konvex »

Jetzt zeigt er mir zwar keinen Fehler mehr an, aber funktionieren tuts irgendwie trotzdem nicht...
Antworten