我有一個奇怪的問題,我一直無法確定原因。基本上,我創建了具有平移和縮放功能的2D視圖以及可以通過網格對齊移動的項目。要移動場景中的項目,我擴展了Scene::mousePressEvent
以獲取指向該項目的指針,並且使Scene::mouseMoveEvent
獲得指示器以跟蹤光標上的項目。要刪除該項目,我再次使用了Scene::mousePressEvent
。爲了平移,我擴展了View::mousePressEvent
,View::mouseReleaseEvent
和View::mouseMoveEvent
並將I擴展爲View::wheelEvent
。QGraphicsScene mouseMoveEvent不工作,直到QGraphicsView wheelEvent
現在的症狀:
我開始與場景中的項目的應用程序。如果我點擊並按住,然後移動鼠標,該項目將按預期移動。只要我釋放鼠標按鈕,該項目停止移動。我可以點擊放下,並根據Scene::mousePressEvent
中的下拉代碼放置該項目。再試一次,只有當鼠標按鈕被按下時,項目纔會移動。
然後出現奇怪的部分:如果我使用鼠標滾輪縮放視圖,那麼在該事件發生後,所有事情都按預期執行。點擊鼠標來選擇一個項目,它隨着我移動鼠標而移動,當我再次點擊時,它會掉落。
那麼顯而易見的解決方案:
wheelEvent(new QWheelEvent(QPointF(0,0),0,Qt::NoButton,Qt::NoModifier));
稱爲在創建視圖,一切工作正常。它調用擴展的View::wheelEvent
而不改變視圖,甚至在創建場景之前,但之後程序的行爲如預期。
所以我在這裏看看有沒有優秀的Qt專家能解釋這種奇怪的行爲。任何意見或方向表示讚賞。
如果有幫助,這裏是View::wheelEvent
覆蓋代碼。 tform
是與我保持縮放的QTransform
。另外,我嘗試過和沒有調用基本方法,但行爲沒有變化。
void SchematicView::wheelEvent(QWheelEvent* event)
{
// Scale the view/do the zoom
double scaleFactor = 1.1;
if(event->delta() > 0 && tform.m11() < max_zoom) {
tform.scale(scaleFactor,scaleFactor);
} else if (event->delta() < 0 && tform.m11() > min_zoom){
tform.scale(1.0/scaleFactor,1.0/scaleFactor);
}
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
setTransform(tform);
QGraphicsView::wheelEvent(event);
}
請注意,您的顯而易見的解決方案被泄露QWheelEvent對象......你會更好放置QWheelEvent對象在棧上,或wheelEvent()返回後,至少將其刪除。 –