Seite 1 von 2

ItemIsMovable???

Verfasst: 12. Dezember 2008 13:48
von konvex
Hallo,
ich möchte ein Item bewegen, aber nur wenn ich die rechte Maustaste drück.
Kann mir jemand sagen wie ich das mache?
Ich hab es so probiert:

Code: Alles auswählen

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
pos=e->scenePos();
end=e->scenePos();
item = new EllipseItem(pos.x(), pos.y(),10,10);
item2 = new EllipseItem(end.x(), end.y(),10,10);
 
if(e->button() == Qt::LeftButton)
{
	if(itemAt(pos))
	{ QGraphicsScene::mousePressEvent(e); }
	
	else 
	{
	addItem(item);
	addItem(item2);

	linie = new LineItem(item,item2);
	addItem(linie);
	}
}

if(e->button() == Qt::RightButton)
{
	item->setFlags(QGraphicsItem::ItemIsMovable);
	item2->setFlags(QGraphicsItem::ItemIsMovable);
}
        //dieser Teil funktioniert aber nicht?!

}

Verfasst: 12. Dezember 2008 14:14
von The User
Also was hast du vor:
Beim Drücken einer Maustaste werden zwei neue Items erstellt.
Erstellt man sie mit rechts, sollen sie beweglich sein.
Richtig?
Du solltest dann aber auch addItem() oder gleich die addEllipse()-Funktion aufrufen, ansonsten hast du nur irgendwo im Speicher eine Ellipse stehen. ;)

Verfasst: 12. Dezember 2008 14:18
von konvex
Ja genau. Ich will das er mit links zeichnet(Ellipse und Linie) und wenn ich mit rechts auf die Ellipse drück will ich es bewegen können, also mit rechts soll er sie nicht zeichnen, sondern nur bewegen...
Ne Idee wie ich das mach?

Verfasst: 12. Dezember 2008 14:29
von The User
Ahh, das ist etwas anderes.
Du musst dir folgendes vor Augen führen:
Wenn du addItem aufrufst, wird Qt die Speicheradresse kopieren und intern abspeichern.
Rufst du nun item = new ... auf, verändert sich die Speicheradresse in item, Qt hat allerdings noch die alte Adresse. Du hast also zwei Möglichkeiten:
1. Das item = new ... und item2 = new .. rufst du nur auf, wenn der linke Mauszeiger gedrückt worden ist, dann wird das zuletzt eingefügte Item auf beweglich gesetzt.
2. Du verwendets itemAt() und setzt dann dort das Item auf beweglich, dann wird sich das ausgewählte Item bewegen können.

Es hängt eben davon ab, was du machen möchtest. ;)

Verfasst: 12. Dezember 2008 14:47
von konvex
Naja, das haut nicht so richtig hin.
Momentan sieht mein Programm für die Scene so aus:

Code: Alles auswählen


void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
pos=e->scenePos();
end=e->scenePos();

if(e->button() == Qt::LeftButton)
{
item = new EllipseItem(pos.x(), pos.y(),10,10);
item2 = new EllipseItem(end.x(), end.y(),10,10); 
                  // hab die items jetzt hier eingefügt
 
	if(itemAt(pos))
	{QGraphicsScene::mousePressEvent(e);  }
	
	else 
	{
	addItem(item);
	addItem(item2);

	linie = new LineItem(item,item2);
	QObject::connect(item, SIGNAL(positionchanged()), linie , SLOT(updatePosition()));
	QObject::connect(item2, SIGNAL(positionchanged()), linie , SLOT(updatePosition()));
	addItem(linie);
	}
}


if(e->button() == Qt::RightButton)
{
	item->setFlags(QGraphicsItem::ItemIsMovable);
	item2->setFlags(QGraphicsItem::ItemIsMovable);
}
}

void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
if(e->buttons()==Qt::LeftButton)
	{
	item2->setPos(e->scenePos());
	item2->update();
	linie->updatePosition();
	linie->update();
	}
QGraphicsScene::mouseMoveEvent(e);
}

void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{

QGraphicsScene::mouseReleaseEvent(e);
end=e->scenePos();
}
Aber dann bewegt er die mit links und ignoriert vollkommen die rechte Taste...
Also ich brauche die rechte Taste , weil ich immer 2 Ellipsen mit einer linie verbinde und wenn ich später eine weitere linie von der ersten ziehen will soll sie sich ja nicht bewegen.

Verfasst: 12. Dezember 2008 19:07
von konvex
keine Idee?

Verfasst: 12. Dezember 2008 20:40
von The User

Code: Alles auswählen

void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
if(e->buttons()==Qt::LeftButton) 
Wenn es die rechte Maustaste sein soll, würde ich auch für die rechte Maustaste überprüfen, und nicht für die linke. ;)

Verfasst: 12. Dezember 2008 20:47
von franzf
Alternativ nen Button setzen, mit dem man move/add umschalten kann, und entsprechend reagieren.

Verfasst: 13. Dezember 2008 10:17
von konvex
Aber es müsste doch möglich sein das einfach auf die rechte Taste abzustellen, oder?!
Ich habe das mal mit einer anderen Funktion probiert und rausgefunden, dass er auf die Taste reagiert, aber scheinbar die Funktion (ItemIsMovable) nicht ausführt.

Verfasst: 13. Dezember 2008 11:47
von The User
In dem MouseMoveEvent einfach nach rechter fragen. ;)

Verfasst: 13. Dezember 2008 12:25
von konvex
Na, du meinst das, oder?

Code: Alles auswählen

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
pos=e->scenePos();
end=e->scenePos();
item = new EllipseItem(pos.x(), pos.y(),10,10);
item2 = new EllipseItem(end.x(), end.y(),10,10);
 
if(e->button() == Qt::LeftButton)
{
	if(itemAt(pos))	
	{QGraphicsScene::mousePressEvent(e); }
	
        else
	{
	addItem(item);

	linie = new LineItem(item,item2);
	QObject::connect(item, SIGNAL(positionchanged()), linie , SLOT(updatePosition()));
	QObject::connect(item2, SIGNAL(positionchanged()), linie , SLOT(updatePosition()));
	addItem(linie);
	}
}

}


void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)

{
if(e->buttons()==Qt::RightButton)
       {
	item->setFlags(QGraphicsItem::ItemIsMovable);
	item2->setFlags(QGraphicsItem::ItemIsMovable);
       }
// hier eingefügt

if(e->buttons()==Qt::LeftButton)
	{
	item2->setPos(e->scenePos());
	item2->update();
	linie->updatePosition();
	linie->update();	
	}
QGraphicsScene::mouseMoveEvent(e);
}


void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
QGraphicsScene::mouseReleaseEvent(e);
end=e->scenePos();

	if(itemAt(end))
	{ QGraphicsScene::mouseReleaseEvent(e); }

	else
	{ addItem(item2);}
}
wenn ich das an der Stelle einfüg macht er es trotzdem nicht...
wobei er daneben im mousereleaseevent zusätzlich dann noch eine Ellipse an die stelle setzt(aber wenn ich im release.. noch ...leftbutton... hinschreib macht er mir dann auch gar keine Ellipse mehr).

Verfasst: 13. Dezember 2008 12:28
von The User
Da steht:

Code: Alles auswählen

if(e->buttons()==Qt::LeftButton)
   {
   item2->setPos(e->scenePos());
   item2->update();
   linie->updatePosition();
   linie->update();   
   }
QGraphicsScene::mouseMoveEvent(e);
} 
Wenn du machen würdest:

Code: Alles auswählen

if(e->buttons()==Qt::RightButton)
   {
   item2->setPos(e->scenePos());
   item2->update();
   linie->updatePosition();
   linie->update();   
   }
QGraphicsScene::mouseMoveEvent(e);
} 
Würde er das auch mit der rechten Maustaste machen, ist doch nicht so schwer.

Verfasst: 13. Dezember 2008 12:31
von MiKla
Ich denke er meint:

Code: Alles auswählen

if(e->buttons()==Qt::LeftButton)
Wie soll hier die rechte Maustaste erkannt werden?

Michael

Verfasst: 13. Dezember 2008 12:40
von konvex
Das macht er ja eben nicht, das hab ich ja so auch schon probiert...
im pressevent zeichnet er eine ellipse1.
Im moveevent zieht er ja nur die linie von ellipse1 zu ellipse2.
und im releaseevent zeichnet er die ellipse2 am ende.

Verfasst: 13. Dezember 2008 12:44
von Spring-Daniel
Zudem sollte das Setzen des ItemIsMovable-Flags einmal genügen, und wenn ich die Doku richtig verstanden habe kümmert sich Qt dann sogar selbst um das Verschieben der Items?
Ausserdem solltest Du Dir gut überlegen wann Du Items mit new erzeugst oder diese zur GraphicsScene hinzufügst. In der jetzigen Version kannst Du ziemlich leicht Pointer verschlampen...
Und wie immer schadet voheriges eigenständiges Nachdenken nie vor einem Forums-Post.
Trotzdem weiter viel Motivation.