drop event source in QGraphicsItem

Alles rund um die Programmierung mit Qt
Antworten
killkolor
Beiträge: 4
Registriert: 9. November 2006 11:58

drop event source in QGraphicsItem

Beitrag von killkolor »

hi

ich hab ein kleines graph programm bei dem knoten als QGraphicsItem auf einer QGrahpicsView dargestellt sind. Zwischen den knoten soll man über rechts-klick drag&drop kanten einfügen können. d.h. konkret ich hab ein knoten objekt vom typ QGraphicsView, das einerseits dragable sein soll und andererseit drop events empfangen soll. meine funktion um kanten zu machen empfängt 2 pointer auf die beiden knoten (new Edge(node1, node2)). im drop event sollte das ganze jetzt etwa so aussehen:
new Edge(event->source(), this);
leider ist event->source() vom typ QWidget * und ich hab keinen weg gefunden das auf QGraphicsItem zu casten. Normale C++ static_cast und dynamic_cast funktionieren auch nicht. gibts hier ne möglichkeit den cast auszuführen?
ich hab dann versucht setFocusItem() dort zu setzen wo drag->start() gemacht wird und scene()->focusItem im drop event um die source zu kriegen. leider is im QGraphicsItem scene() nicht definiert. ich hab aber nen member auf die parent view (QGraphicsView *). diese sollte ja dann scene() haben. auf den aufruf graph->scene() krieg ich alle member von graph, die ich selbst implementiert habe, aber keine von QGraphicsView (ich mache public inheritance), also is auch scene() nicht da.
hat irgendjemand ne idee wie ich das machen kann? am liebsten natürlich über nen einfachen cast auf einen member von event, wie zuerst versucht, das wär code mässig einfach das sauberste.

danke!
killkolor
Beiträge: 4
Registriert: 9. November 2006 11:58

Beitrag von killkolor »

ok, der zweite versuch funktioniert jetzt, hab vergessen das ItemIsFocusable flag zu setzen. Also 2ten teil ignorieren. wenn jemand weiss, wie man einen cast durchführen kann (erster teil) wärs aber trotzdem super.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Irgendwie versteh ich nur Bahnhof. Du kannst auf jeden Fall QWidget nicht nach QGraphicsItem casten und umgekehrt. Vielleicht solltest du uns zum besseren Verständnis deinen Code zeigen...
killkolor
Beiträge: 4
Registriert: 9. November 2006 11:58

Beitrag von killkolor »

sorry, is wohl etwas kryptisch beschrieben. also hier is mal die funktion um die es geht:

void DrawNode::dropEvent(QGraphicsSceneDragDropEvent *event)
{
QList<QGraphicsItem *> sel = scene()->selectedItems();
QGraphicsItem *item = sel.at(0);
//QGraphicsItem *item = scene()->focusItem();
DrawNode *otherNode = qgraphicsitem_cast<DrawNode *>(item);
if (otherNode != NULL && otherNode != this)
{
scene()->addItem(new Edge(otherNode, this));
}

update();
}

anstatt das ganze über selectedItems zu machen, würd ich eigentlich lieber den anderen knoten aus dem event pointer kriegen. der drag wird so gestartet:

void
DrawNode::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
update();
QGraphicsItem::mousePressEvent(event);

if (event->button() == Qt::RightButton)
{
QDrag *drag = new QDrag(event->widget());
QMimeData *mime = new QMimeData;
drag->setMimeData(mime);

this->setSelected(true);
//scene()->setFocusItem(this, Qt::MouseFocusReason);

drag->start();
}

}

beide funktionen werden in DrawNode definiert, welches vom Typ QGraphicsItem ist. das ganze macht also einen drag&drop von einem DrawNode zu einem anderen DrawNode (und erstellt dann ein Edge zwischen den beiden).
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Es wird dir auch nichts bringen, das QWidget vom QDrag auszuwerten, da das QWidget immer auf die gesamte Scene bezogen ist und nicht auf ein einzelnes Item. Aber du könntest bei QMimeData als zusätzliche Daten eine ID (event. sogar einen Pointer) vom Quell-Item mitgeben und diese beim Drop dann auswerten?
killkolor
Beiträge: 4
Registriert: 9. November 2006 11:58

Beitrag von killkolor »

hmm.. sowas hatte ich mir auch überlegt, find ich aber codetechnisch nich so schön. ich belass es demfall erstmal bei der selection methode.
Antworten