2010-02-24 8 views
2

我想修改Qt提供的fridge magnets example,當我拖動標籤並將其放在另一個標籤上時,它會將拖動的標籤下面的標籤推到一邊,以便它們將從不相互重疊。Qt冰箱磁鐵中的重疊標籤示例

我已經看到在colliding mice example中檢測到碰撞,它使用QGraphicsScene繪製QGraphicsItem鼠標,並使用scene() - > collidingItems(this)來查看哪些鼠標正在碰撞。

問題是,冰箱磁鐵的例子使用繼承QWidget代替QGraphicsScene的類,所以沒有collidingItems()方法來檢查我們什麼時候碰撞。

我該如何去做呢?

回答

2

您可以從geometry()得到每個QWidget的位置和大小,它返回QRectQRect有功能intersects(),它會告訴你它是否與另一個QRect相交。完成刪除後,遍歷所有標籤並檢查它們中的任何一個是否與新位置相交。

(如果修改dragwidget保持在dragwidget每個標籤的QList<DragLabel*>這會更容易。)

QRect droppedRect = newLabel->geometry(); 
foreach(DragLabel* label, dragLabelList) 
{ 
    if (droppedRect.intersects(label->geometry()) 
    { 
    // Add to the list of covered labels that need to be moved. 
    } 
} 

較難的部分:如果有一個路口,將舊標籤的方式進行。

也許嘗試以下算法:將移動標籤移動到最少移動的方向。現在檢查所有其他標籤。任何被覆蓋的應該朝相同的方向移動。重複,直到所有的標籤被揭露。