2013-08-31 54 views
4

QGraphicsview有一個方法setDragMode(ScrollHandDrag),用於通過單擊鼠標左鍵來啓用平移。但我想啓用平移單擊鼠標滾輪時(中間的按鈕),並創建以下定製實現鍋:Qt:實現平移的正確方法(拖動)

//Within a custom derived class of QGraphicsView 
//pan is true when wheel is clicked and false when released 
//last Pos is defined somewhere else in the class 

void GridView::mouseMoveEvent(QMouseEvent *event){ 
    if(pan){ 
     QPointF currentPos = event->pos(); 
     QPointF relPos = currentPos - lastPos; 
     lastPos = currentPos; 

     //this is what creates the panning effect 
     translate(relPos.x(), relPos.y()); 
    } 
    QGraphicsView::mouseMoveEvent(event); 
} 

也能正常工作的大部分。但是,例如,如果我將單位矩陣縮放1,000,000,則此方法失敗並停止平移(就像視圖卡住了一樣)。當我使用setDragMode()

時,不會出現這個問題setDragMode()正確的自定義實現是什麼,所以它通過輪子點擊來啓用?

回答

10

這對我很有用...它讓人想到用戶在按下鼠標左鍵的時候按下了鼠標左鍵。

void GridView :: mousePressEvent(QMouseEvent * e) 
{ 
    if (e->button() == MidButton) 
    { 
     QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers()); 
     QGraphicsView::mousePressEvent(&fake); 
    } 
    else QGraphicsView::mousePressEvent(e); 
} 

void GridView :: mouseReleaseEvent(QMouseEvent * e) 
{ 
    if (e->button() == MidButton) 
    { 
     QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers()); 
     QGraphicsView::mouseReleaseEvent(&fake); 
    } 
    else QGraphicsView::mouseReleaseEvent(e); 
} 
+1

這是一個很好的解決方法!我將它與調用setInteractive true/false和setDragMode ScrollHandDrag/NoDrag分別用於新聞發佈事件 – Shootfast

+0

@Shootfast偉大的東西。也一樣。 –

+0

如果您需要LeftButton事件來處理其他事情,這可能無法按預期工作。這裏描述了一種替代方法:https://stackoverflow.com/a/5156978/2055281 – user31208

相關問題