2013-04-19 7 views
5

Ho una finestra QGraphicsView sul mio widget e ho appena inserito un evento per la rotellina del mouse che ingrandisce l'immagine.Rimuovere la funzionalità di scorrimento sulla rotellina del mouse QGraphics view

Tuttavia, non appena vengono visualizzate le barre di scorrimento e la funzionalità di scorrimento sulla rotellina del mouse ha la precedenza sulla funzione di zoom che ho.

mi chiedevo se non v'è alcun modo che io possa rimuovere lo scorrimento tutti insieme e aggiungere un trascinare per spostare l'opzione o forse un CTRL e la rotellina del mouse per ingrandire e rotella del mouse solo controllerebbe lo scorrimento

qui è il mio zoom la funzione (che im conoscenza perfetta isnt), ma se qualcuno potesse far luce su che sarebbe un bonus

applausi in anticipo

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

risposta

4

è reimplementato wheelEvent per QWidget/QMainWindow che contiene il QGraphicsView, come mai, wheelEvent di QGraphicsView rimane intatto.

È possibile derivare da QGraphicsView, reimplementare wheelEvent per la classe derivata e utilizzare la classe derivata invece di QGraphicsView: in questo modo non sarà necessario wheelEvent nella QWidget/QMainWindow e sarà possibile personalizzare wheelEvent reimplementato per fare ciò che si desidera. Qualcosa del genere: il file

intestazione: file di

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

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

Fonte:

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

Penso che la tua domanda ha risposta un po 'più semplice .. Per disattivare le barre di scorrimento è sufficiente impostare politiche barra di scorrimento (QGraphicsView è solo QScrollView), quindi passaggio 1)

setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

che disabiliterà le barre di scorrimento ..

punto 2) (se si vuole mantenere le cose semplici)

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

questo è il modo più veloce per ottenere risultati desiderati

+0

sì, probabilmente hai ragione, e come affermato nella risposta precedente dovresti reimplementare wheelEvent comunque. Nella maggior parte del mio codice lo reimplemento direttamente all'inizio, quindi non ho mai pensato che abbia funzionalità scroll =))) mi dispiace per quello – evilruff

3

scorrimento può essere disabilitato con il seguente codice:

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