Seite 1 von 1

QGraphicsView scrollen ausschalten

Verfasst: 2. April 2010 10:50
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

Verfasst: 2. April 2010 11:32
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

Verfasst: 2. April 2010 12:45
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

Verfasst: 2. April 2010 12:55
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

Verfasst: 2. April 2010 13:10
von OnJen
ok zoomen klappt, aber nur wenn der scrollbalken oben bzw unten ist
woran könnte das liegen?

Verfasst: 2. April 2010 13:43
von -=Freaky=-
evtl. musst du QAbstractScrollArea::scrollContentsBy( int dx, int dy ) ueberladen oder einfach die scrollbalken wegnehmen (s. doku zu QAbstractScrollArea).

mfg,
julian

Verfasst: 2. April 2010 14:11
von OnJen
alles klar ich schau mich mal um

danke für die Hilfe

Verfasst: 2. April 2010 14:45
von upsala
Mach einfach mal bei beiden QScrollBar's hide().

Verfasst: 2. April 2010 15:24
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?

Verfasst: 2. April 2010 17:08
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

Verfasst: 2. April 2010 17:31
von OnJen
super vielen vielen dank es funzt

Gruß
Johannes