Seite 1 von 1

QGraphicsView beliebig verschieben ohne ScrollHandDrag

Verfasst: 13. Februar 2009 01:04
von VuuRWerK
Hallo liebe Gemeinde,

ich frag eigentlich nur ungern da ich jederzeit gewillt bin selber Lösungen für Probleme zu finden aber diesmal find ich selbst nach Stundenlangen suche keine Lösung die mich weiter bringt.

Ich möchte gern eine QGraphicsView mit gedrücktem Mausrad verschieben. Problem ist jedoch, es regt sich nix. Die View bleibt wie und wo sie ist. Zoomen funktioniert prima aber verschieben nicht?
Ich möchte nur ungern QGraphicsView::ScrollHandDrag benutzen da ich den DragMode schon auf QGraphicsView::RubberBandDrag gesetzt habe da es mir etwas mehr nützt, aber vorher hab ich ja auch noch gedacht dass das verschieben kein Problem darstellen dürfte :)

So schaut es momentan aus:

Code: Alles auswählen

void SymbolEditorView::mouseMoveEvent(QMouseEvent *mouseEvent) {
    if ((mouseEvent->buttons() & Qt::MidButton) != 0) {
        QPoint moveTo(mouseEvent->pos() - m_startPos);
        if (moveTo.manhattanLength() < QApplication::startDragDistance())
            return;

        qDebug() << "moveTo = " << moveTo << "; moveTo.x() = " << moveTo.x() << ", moveTo.y()" << moveTo.y();
        QMatrix matrix;
        matrix.translate(moveTo.x(), moveTo.y());
        setMatrix(matrix);
//        translate(moveTo.x(), moveTo.y());
    } else {
        QGraphicsView::mouseMoveEvent(mouseEvent);
    }
}

void SymbolEditorView::mousePressEvent(QMouseEvent *mouseEvent) {
    QGraphicsView::mousePressEvent(mouseEvent);
    if (mouseEvent->button() == Qt::MidButton) {
        m_startPos = mouseEvent->pos();
        setCursor(Qt::ClosedHandCursor);
    }
}

void SymbolEditorView::mouseReleaseEvent(QMouseEvent *mouseEvent) {
    QGraphicsView::mouseReleaseEvent(mouseEvent);
    if (mouseEvent->button() == Qt::MidButton)
        setCursor(Qt::ArrowCursor);
}
Habe wie gesagt die Große Suchmaschine schon strapaziert aber alles was ich finden konnte hat mir leider nicht geholfen. Hoffe das einer von Euch mir helfen kann :)

Gut Schuß
VuuRWerK ;)

Verfasst: 13. Februar 2009 09:32
von franzf
Hast du dir den QGraphicsView-Quelltext mal angeschaut?
Die machen das bei ScrollHandDrag nicht über ne Matrix, sondern mittels den ScrollBars :D

Code: Alles auswählen

    if (d->dragMode == QGraphicsView::ScrollHandDrag) {
        if (d->handScrolling) {
            QScrollBar *hBar = horizontalScrollBar();
            QScrollBar *vBar = verticalScrollBar();
            QPoint delta = event->pos() - d->lastMouseEvent.pos();
            hBar->setValue(hBar->value() + (isRightToLeft() ? delta.x() : -delta.x()));
            vBar->setValue(vBar->value() - delta.y());

            // Detect how much we've scrolled to disambiguate scrolling from
            // clicking.
            ++d->handScrollMotions;
        }
    }
Ansonsten kannst du ja immer noch einen zusätzlichen Key (z.B. Strg oder Shift) als Aktivator einschalten (in keyPressEvent).

Code: Alles auswählen

if( event()->key() & Qt::Key_Control ) {
    setDragMode(QGraphicsView::ScrollHandDrag);
    return;
}
QGraphicsView::keyPressEvent(event);
Und im keyReleaseEvent (das kommt noch von QWidget) einfach den DragMode wieder auf RubberBand schalten.
(Nimm als key lieber nicht Alt. Denn unter Linux fängt meistens der WindowManager die Kombi Alt+MouseMove ab und verschiebt das Fenster)

Grüße
Franz

Verfasst: 13. Februar 2009 17:08
von VuuRWerK
franzf hat geschrieben:Hast du dir den QGraphicsView-Quelltext mal angeschaut?
Die machen das bei ScrollHandDrag nicht über ne Matrix, sondern mittels den ScrollBars :D
Warum tun die sowas ... ^^
Klar hab ich da auch mal rein geschaut aber wie das eben so ist bin ich gestern Nacht nicht auf die Idee gekommen zu schauen wie sie das ScrollHandDrag implementieren ... :oops:

Ok, dann werde ich das heute Abend mal ebenso über die Scrollbars (ich komm nicht drüber weg ... ^^, ja ok es ist eine QAbstractScrollArea ...) implementieren da ein zusätzlicher Tastendruck nicht erforderlich sein soll.

Danke Dir schonmal wie verrückt für den Hieb :lol:

Gut Schuß
VuuRWerK ;)