ItemIsMovable???

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

ItemIsMovable???

Beitrag 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?!

}
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

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

Beitrag 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?
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

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

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

Beitrag von konvex »

keine Idee?
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag 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. ;)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Alternativ nen Button setzen, mit dem man move/add umschalten kann, und entsprechend reagieren.
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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.
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

In dem MouseMoveEvent einfach nach rechter fragen. ;)
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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).
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag 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.
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag von MiKla »

Ich denke er meint:

Code: Alles auswählen

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

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

Beitrag 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.
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag 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.
Antworten