QGraphicsView scrollen ausschalten

Alles rund um die Programmierung mit Qt
Antworten
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

QGraphicsView scrollen ausschalten

Beitrag von OnJen »

Hallo

Ich würde gerne mit dem Mausrad eine Scene in einem GrahpicsView zoomen, jedoch liegt standardmäßig das scrollen des GraphicsView auf dem mausrad.

Wie kann ich das ausstellen?

Gruß
OnJen
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

du kannst das wheelEvent ueberladen.
bei mir sieht das so aus:

Code: Alles auswählen

void MainWindow::wheelEvent(QWheelEvent *event)
{
    if(event->modifiers() & Qt::ControlModifier)
    {
        int steps = event->delta() / (8 * 15);
        qreal zoom = steps * 0.3;
        m_graphicsView->scale(1.0 + zoom, 1.0 + zoom);
    }
    else
        QMainWindow::wheelEvent(event);
}
die zeile steps = ... (anzahl der "schritte") ergibt sich aus der doku zu QWheelEvent::delta (), der faktor 0.3 hat bei mir gut funktioniert, ist aber zufaellig gewaehlt.

mfg,
julian
Zuletzt geändert von -=Freaky=- am 2. April 2010 12:55, insgesamt 1-mal geändert.
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

Beitrag von OnJen »

danke für die Antwort Freaky, aber mein problem ist ein bisschen ein anderes.

Und zwar habe ich für die Scene eine eigene Klasse, der View jedoch ist in der Mainwindow Klasse.
Das wheelEvent ist in der Scene Klasse wird aber einfach von dem scrollen der View in der MainWindow Klasse überlagert.

Doch wie kann ich das ausstellen beim View?

Gruß
OnJen
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

entweder ich verstehe dich nicht, oder der aufbau ist bei uns beiden derselbe ... (?)

ein QMainWindow enthaelt ein QGraphicsView, worin eine QGraphicsScene dargestellt wird.
ueberlaedt man das wheelEvent des QMainWindow, passiert, was du willst - denke ich.
wenn du im QMainWindow das event dann in einem best. fall (bei mir, wie du siehst, wenn gleichzeitig CTRL gedrueckt ist) nicht weiterleitest, kommt es auch nicht beim QGraphicsView oder der QGraphicsScene an.

ich habe jetzt das QGraphicsView rangezoomt, aber ueber QGraphicsView()::scene() kannst du das sicher auch mit der scene machen ...

// edit: wenn du es in der scene machen willst, musst du ggf. eine klasse von QGraphicsView ableiten und das wheelEvent auch da ueberladen, oder einen eventFilter dafuer benutzen

mfg,
julian
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

Beitrag von OnJen »

ok zoomen klappt, aber nur wenn der scrollbalken oben bzw unten ist
woran könnte das liegen?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

evtl. musst du QAbstractScrollArea::scrollContentsBy( int dx, int dy ) ueberladen oder einfach die scrollbalken wegnehmen (s. doku zu QAbstractScrollArea).

mfg,
julian
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

Beitrag von OnJen »

alles klar ich schau mich mal um

danke für die Hilfe
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Mach einfach mal bei beiden QScrollBar's hide().
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

Beitrag von OnJen »

hab sie beide mal ausgestellt, er scrollt aber trotzdem bis zu den Rändern und fängt dann erst an zu zoomen

jemand noch ne idee?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich habs gerade mal ausprobiert und es so hinbekommen:

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent = 0)
  : QMainWindow(parent)
{
    m_graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_graphicsView->horizontalScrollBar()->installEventFilter(this);
    m_graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_graphicsView->verticalScrollBar()->installEventFilter(this);
}

void MainWindow::wheelEvent(QWheelEvent *event)
{
    if(event->modifiers() & Qt::ControlModifier)
    {
        int steps = event->delta() / (8 * 15);
        qreal zoom = steps * 0.3;
        m_graphicsView->scale(1.0 + zoom, 1.0 + zoom);
    }
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if((obj == m_graphicsView->horizontalScrollBar() || obj == m_graphicsView->verticalScrollBar())
       && event->type() == QEvent::Wheel
       && reinterpret_cast<QWheelEvent*>(event)->modifiers() & Qt::ControlModifier) // um das wheelEvent nur dann zu filtern, wenn ich auch zoomen will
        return true;

    return false;
}
vllt. hilft das, keine ahnung obs in dein konzept so reinpasst.

mfg,
julian
OnJen
Beiträge: 13
Registriert: 1. April 2010 08:03

Beitrag von OnJen »

super vielen vielen dank es funzt

Gruß
Johannes
Antworten