2011-08-10 59 views
0

你好,感謝您的閱讀。我在QGraphicsView中拖動鼠標時無法正確量化多個QGraphicsItems的位置。我設置的系統是正確量化一個QGraphicsItem,如果一次只拖動一個,但是如果我有多個選擇並拖動它們,只有主要項目(直接在鼠標下面)量化,其餘的位置設置爲連續。我非常感謝任何幫助。相關代碼如下:如何在QGraphicsView中拖動鼠標的同時量化多個QGraphicsItems的位置?

這是一個名爲MutaEvent的類,它繼承自QGraphicsRectItem。我已經重新定義了mouseMoveEvent()和setPos()函數:

void MutaEvent::mouseMoveEvent(QGraphicsSceneMouseEvent * event) 
{ 
    QGraphicsRectItem::mouseMoveEvent(event); 
    setPos(pos()); 
} 

void MutaEvent::setPos(const QPointF &pos) 
{ 
    QGraphicsRectItem::setPos(Muta::quantizePointD(pos,30,15)); 
    emit posChanged(objectID,pos); 
} 

下一位是在一個命名空間的靜態函數調用木塔:

static QPointF quantizePoint(QPointF point,double xQuant, double yQuant) 
{ 
    double x = quantize(point.x(),xQuant); 
    double y = quantize(point.y(),yQuant); 
    QPointF quantPoint(x,y); 
    return quantPoint; 
} 

任何幫助,將不勝感激!

回答

0

看看覆蓋QGraphicsItem::itemChange受保護的功能。從那裏你可以通知物品位置即將改變(QGraphicsItem::ItemPositionChange),並有機會修改該值。這種方法被稱爲不管變化是如何開始(鼠標移動,組,在代碼中設置的一部分,等等)

我懷疑你的問題的一部分是,QGraphicsItem::setPos()虛擬的,這意味着你的setPos()函數將不會被調用,如果一個調用者將您的MutaEvent*的實例視爲QGraphicsItem*。在Qt框架中,無處不在,因爲他們不知道你的類。這就是爲什麼他們提供虛擬itemChange方法。

0

所有選擇的項目是您的MutaEvent類嗎?每個選定的項目都會調用setPos(),所以如果不是,它只會使用默認實現。

如果您希望它正常工作(順便說一句,在MutaEvent :: mouseMoveEvent中調用setPos(pos())將不起作用),您可能需要實現自己的鼠標事件處理。

相關問題