2013-04-19 5 views
5

Ich habe ein QGraphicsView-Fenster auf meinem Widget und habe gerade ein Ereignis für das Mausrad eingefügt, das auf das Bild zoomt.Scroll-Funktion am Mausrad entfernen QGraphics-Ansicht

Sobald ich jedoch zoome, werden Bildlaufleisten angezeigt und die Bildlauffunktion auf dem Mausrad überschreibt die Zoomfunktion, die ich habe.

Ich frage mich, ob es eine Möglichkeit ist, dass ich entfernen können alle zusammen und fügen Sie eine Drag-Scrolling-Option zu bewegen, oder vielleicht ein CTRL und Mausrad zoomen und allein Mausrad würde steuern

hier Scrollen ist mein Zoom Funktion (Welche bewusst ist nicht perfekt im) aber wenn jemand könnte etwas Licht auf, dass es einen Bonus

Jubel im Voraus

void Test::wheelEvent(QWheelEvent *event) 
{ 
    if(event->delta() > 0) 
    { 
     ui->graphicsView->scale(2,2); 
    } 
    else 
    { 
     ui->graphicsView->scale(0.5,0.5); 
    } 
} 

Antwort

4

Sie reimplementiert wheelEvent für QWidget/QMainWindow sein würde, die Ihre QGraphicsView enthält, wie Bisher bleibt WheelEvent von QGraphicsView erhalten.

Sie können von QGraphicsView ableiten, WheelEvent für abgeleitete Klasse reimplementieren und Ableitungsklasse anstelle von QGraphicsView verwenden - auf diese Weise brauchen Sie nicht einmal WheelEvent in Ihrem QWidget/QMainWindow, und Sie können WheelEvent neu implementieren, um zu tun, was Sie wollen. So etwas Ähnliches:

Header-Datei:

class myQGraphicsView : public QGraphicsView 
{ 
public: 
    myQGraphicsView(QWidget * parent = nullptr); 
    myQGraphicsView(QGraphicsScene * scene, QWidget * parent = nullptr); 

protected: 
    virtual void wheelEvent(QWheelEvent * event); 
}; 

Quelldatei:

myQGraphicsView::myQGraphicsView(QWidget * parent) 
: QGraphicsView(parent) {} 

myQGraphicsView::myQGraphicsView(QGraphicsScene * scene, QWidget * parent) 
: QGraphicsView(scene, parent) {} 

void myQGraphicsView::wheelEvent(QWheelEvent * event) 
{ 
    // your functionality, for example: 
    // if ctrl pressed, use original functionality 
    if (event->modifiers() & Qt::ControlModifier) 
    { 
     QGraphicsView::wheelEvent(event); 
    } 
    // otherwise, do yours 
    else 
    { 
     if (event->delta() > 0) 
     { 
      scale(2, 2); 
     } 
     else 
     { 
      scale(0.5, 0.5); 
     } 
    } 
} 
1

Ich glaube, Ihre Frage etwas einfache Antwort hat .. Um Bildlaufleisten nur gesetzte Bildlaufleiste Politik (QGraphicsView zu deaktivieren ist nur QScrollView), so Schritt 1) ​​

, die Scroll-Bars deaktivieren wird ..

Schritt 2) (wenn Sie wollen es einfach halten)

QGraphicsView * pView; // pointer to your graphics view 
pView->setInteractive(true); 
pView->setDragMode(QGraphicsView::ScrollHandDrag); 

der schnellste Weg, das ist Ergebnisse, die Sie erhalten möchten

+0

yeah, Sie haben wahrscheinlich Recht, und wie in der vorherigen Antwort angegeben, sollten Sie WheelEvent trotzdem neu implementieren. In den meisten meiner Code reimplemente ich es direkt am Anfang, so dass ich nie, dass es Scroll-Funktionalität =))) Entschuldigung hat – evilruff

3

Scrolling kann mit dem folgenden Code deaktiviert werden:

ui->graphicsView->verticalScrollBar()->blockSignals(true); 
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    ui->graphicsView->horizontalScrollBar()->blockSignals(true); 
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);