2013-05-04 153 views
3

如何在QGraphicsWidget上實現鼠標拖拽?QGraphicsWidget的鼠標拖動。

我試着用

setFlag(QGraphicsItem::ItemIsMovable); 

這一段時間的工作(?)

enter image description here

例如,節點6我可以用鼠標移動,但其餘節點慣於舉動。

另外,我怎樣才能實現當我移動某個節點時,連接到該節點的邊緣隨之移動。

回答

0

setFlag(QGraphicsItem :: ItemIsMovable)應該是您用鼠標拖動QGraphicsItem所需的所有東西;你可能想檢查你的代碼,看看你是否意外地在其他對象的某處設置了該標誌,或者類似的東西。 (另外如果你直接從QGraphicsItem中繼承而不是從QGraphicsEllipseItem提供的子類中提取子類,請確保你的contains()和boundingRect()方法返回正確的結果)

至於使附加邊緣隨着節點,我認爲你需要在你自己的代碼中這樣做。特別是,在任何有一個或多個邊緣對象與之關聯的節點上調用setFlag(QGraphicsItem :: ItemSendsScenePositionChanges)。然後在實現節點的QGraphicsItem子類中,覆蓋QVariant itemChange(GraphicsItemChange, const QVariant &)方法。在實現該方法時,請注意第一個參數的值等於QGraphicsItem :: ItemScenePositionHasChanged,如果是,則更新任何關聯的邊對象,以便將相應的端點移動到該節點的新位置。

+0

但它不是QGraphicsItem,它的QGraphicsWidget。當我將子類QGraphicsItem,所有的作品,但問題是,我需要動畫我的場景,並需要該QGraphicsWidgets,因爲他們的屬性,我可以動畫與QPropertyAnimation – Steva 2013-05-05 08:35:10

+0

嗯。你的QGraphicsWidget子類是否覆蓋mousePressEvent()或mouseMoveEvent()或類似的東西?如果是這樣,你可能會檢查那些重新實現,並看看它們對鼠標事件處理有什麼影響(例如,它們只在某些情況下調用超類嗎?它們調用e-> accept()或e-> ignore() )只有在某些情況下?)如果是這樣,這可能解釋爲什麼拖動只在某些情況下起作用。 – 2013-05-05 14:52:34

+0

它的確如此。我重新實現mousePressEvent彈出右鍵單擊菜單。但是我嘗試不用重新實現,仍然存在問題。但是,當我有節點沒有邊緣它工作正常,但與邊緣它不會工作。邊是繼承QGraphicsWIdget的另一個對象,它繪製節點的獨立(首先繪製邊,然後繪製節點)。 – Steva 2013-05-05 16:27:31

1

真正的原因可能是您沒有提供覆蓋shape()函數。該功能用於定義「碰撞」幾何體:您可以點擊的對象部分。如果你直接從QGraphicsItem繼承,似乎沒有提供定義就可以正常工作,但QGraphicsWidget覆蓋了shape()函數本身,並簡單地返回QWidget::rect()(它也可能不在你的類中定義),因此QGraphicsItem的默認實現不是當您從QGraphicsWidget繼承時,您將繼續使用!

如果您提供了形狀函數的定義,它返回一個圍繞您爲節點繪製的圓的橢圓,我敢打賭它可能會開始工作。例如:

QPainterPath MyGraphicsWidget::shape() const 
{ 
    QPainterPath path; 
    path.addEllipse(QPointF(0, 0), 25, 25); 
    return path; 
} 

這可能是一個老問題,但我只花了3個小時試圖弄清楚,我自己。希望這個答案對於那些不在你身邊的人有用;)