QGraphicsView Items mit der Maus bewegen

Alles rund um die Programmierung mit Qt
Antworten
Algorithm93
Beiträge: 26
Registriert: 24. April 2011 10:37

QGraphicsView Items mit der Maus bewegen

Beitrag von Algorithm93 »

Hallo,

Ich habe auf einem QMainWindow einen QGraphicsView.
Da ich die QGraphicsItems später mit der Maus bewegen möchte, habe ich meine eigene Klasse (DragAndDropScene) erstellt, welche von QGrahicsScene erbt.

Im MainWindow erstelle ich eine scene und eine Linie:

Code: Alles auswählen

scene = new DragAndDropScene();
graphicsView->setScene(scene);
QGraphicsLineItem *line = new QGraphicsLineItem(200, 0, 200, 300);
scene->addItem(line);
graphicsView->fitInView(0, 0, 800, 300, Qt::KeepAspectRatio);
Das wird soweit alles schön angezeigt.
Um jetzt das QGraphicsLineItem aber mit der Maus bewegen zu können, habe ich in der Klasse DragAndDropScene folgendes gemacht:

Code: Alles auswählen

void DragAndDropScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    dragingItem = itemAt(event->scenePos(), QTransform());

    mousePressed = true;

    QGraphicsScene::mousePressEvent(event);
}

void DragAndDropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(mousePressed)
    {
        if(dragingItem != NULL)
        {
            dragingItem->setPos(event->scenePos);
        }
    }

    QGraphicsScene::mouseMoveEvent(event);
}

void DragAndDropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    mousePressed = false;
    dragingItem = NULL;

    QGraphicsScene::mouseReleaseEvent(event);
}
Es funktioniert fast: Die Linie wird mit dem Cursor bewegt solange die linke Maustaste gedrückt ist, aber es gibt einen Offset. (etwa 200 pt)
Dieser Offset ist aber auch nicht konstant, sondern hängt davon ab, wo sich die Line zu Begin der Bewegung befand.
Ich kann mir das nicht so genau erklären, was mache ich falsch?

Gruß
Doran
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von nebler »

Hallo Algorithm93,

meine Vermutung ist, dass Du den Offset/Angriffspunkt der Maus nicht berücksichtigst.
Das sieht zumindest so aus.
Beispiel
Beispiel
test.png (6.21 KiB) 7530 mal betrachtet
Viele Grüße

PS: Sicher das Du davon ableiten musst? Recht es nicht bei dem QGraphicsItem die richtigen Flags zu setzten?
http://qt-project.org/doc/qt-4.8/qgraph ... mFlag-enum
--> QGraphicsItem::ItemIsMovable
Algorithm93
Beiträge: 26
Registriert: 24. April 2011 10:37

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von Algorithm93 »

Hallo,

Danke für deine Antwort.
Genau daran lag es!!!!
Jetzt habe ich das berücksichtigt und jetzt passt alles 8)

Noch eine Frage: Ich kann jetzt QGraphicsEllipsItem, QGraphicsTextItem, QGraphicsLineItem, etc... perfekt mit der Maus bewegen.
Jetzt habe ich aber mein eigenes Item (resistor, siehe unten) erstellt (von QGraphicsItem abgeleitet).
Dieses Item wird zwar korrekt angezeigt, allerdings kann ich es nicht verschieben.......

Woran kann es liegen?

So sieht der Code aus:

resistor.h

Code: Alles auswählen

#ifndef RESISTOR_H
#define RESISTOR_H

#include <QGraphicsItem>
#include <QRectF>
#include <QPointF>
#include <QPainter>
#include <QGraphicsLineItem>

class Resistor : public QGraphicsItem
{
public:
    explicit Resistor(qreal xR, qreal yR, qreal widthR, qreal heightR, QGraphicsItem *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

private:
    qreal xR_;
    qreal yR_;
    qreal widthR_;
    qreal heightR_;
};

#endif // RESISTOR_H
resistor.cpp

Code: Alles auswählen

#include "resistor.h"

Resistor::Resistor(qreal xR, qreal yR, qreal widthR, qreal heightR, QGraphicsItem *parent) : QGraphicsItem(parent)
{
    xR_ = xR;
    yR_ = yR;
    widthR_ = widthR;
    heightR_ = heightR;
}

QRectF Resistor::boundingRect() const
{
    return QRectF(xR_, yR_, widthR_, heightR_);
}

void Resistor::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawLine(0, heightR_ / 2.0, widthR_ / 3.0, heightR_ / 2.0);
    painter->drawLine(widthR_ / 3.0, 0, widthR_ / 3.0, heightR_);
    painter->drawLine(widthR_ / 3.0, 0, widthR_ * (2.0 / 3.0), 0);
    painter->drawLine(widthR_ / 3.0, heightR_, widthR_ * (2.0 / 3.0), heightR_);
    painter->drawLine(widthR_ * (2.0 / 3.0), 0, widthR_ * (2.0 / 3.0), heightR_);
    painter->drawLine(widthR_ * (2.0 / 3.0), heightR_ / 2.0, widthR_, heightR_ / 2.0);
}
Danke für eventuelle Tipps!

Gruß
Algorithm93
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von nebler »

Siehe PS Nachricht in der ersten Antwort.
Algorithm93
Beiträge: 26
Registriert: 24. April 2011 10:37

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von Algorithm93 »

Hallo,

Danke für Deine Antwort.
Stimmt!!! Jetzt verstehe ich es. Wenn ich das MoveableFlag setze, dann kann ich die Items bewegen ohne ein spezielles QGraphicsScene zu verwenden!
Aber mit meinem selbst erstellten QGraphicsItem funktioniert es nicht......
Er wird angezeigt, aber ich kann ihn nicht verschieben.....
Die Standard items (QGraphicsLineItem....) gehen aber......

Warum mein eigenes nicht?

Gruß
Algorithm93
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von nebler »

Hallo,

weil whrsch. das Flag nicht gesetzt ist?
Wenn du davon ableitest solltest ist die Impl. inklusive --> siehe OOP!

Und kommentiere mal Deine eigene Scene aus, die ist unnötig und schau was passiert, it's magic ;)

Viele Grüße
Algorithm93
Beiträge: 26
Registriert: 24. April 2011 10:37

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von Algorithm93 »

Hallo,

Danke für die Antwort.
Ich habe meine eigene Klasse auskommentiert und verwende jetzt QGraphicsScene direkt.
Welche Flags müssen denn gesetzt werden?
IsMovable habe ich natürlich gesetzt......
Trotzdem kann das eigene Item nicht bewegt werden.....

Gruß
Doran
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von nebler »

Hej,

evtl. stimmt Deine BoundingBox Kalkulation nicht.
Als Hilfestellung diese einfach mitzeichnen.

Viele Grüße


PS: Code?
Algorithm93
Beiträge: 26
Registriert: 24. April 2011 10:37

Re: QGraphicsView Items mit der Maus bewegen

Beitrag von Algorithm93 »

Hallo,

Danke für die Antwort.
Ich habe den Fehler jetzt gefunden: meine Implemetierung von boundingRect war falsch.
ich hatte:

Code: Alles auswählen

QRectF Resistor::boundingRect() const
{
    return QRectF(xR_, yR_, widthR_, heightR_);
}
aber es muss

Code: Alles auswählen

QRectF Resistor::boundingRect() const
{
    return QRectF(0, 0, widthR_, heightR_);
}
sein.

Danke für den Tipp das boundingRect zu zeichnen! Das hat mich auf diese Idee gebracht.

Gruß
Doran
Antworten