2013-12-08 190 views
3

我已經創建了自己的自定義小部件,並且想要支持小部件的內部拖放操作。如何拖放自定義小部件?

我在垂直框佈局中添加了4個我的自定義小部件。現在我想在內部拖放自定義小部件。更清楚的是,如果我拖動最後一個小部件並將它放在第一個位置,那麼第一個小部件必須移動到第二個位置,並且最後一個小部件(被拖動)必須移動到第一個位置。 (與列表視圖中的項目拖放相同)。任何人都可以建議我拖放自定義小部件的方法。 enter image description here

回答

1

你需要重新實現你想要拖動或在其上安裝一個事件過濾器窗口小部件的mousePressEventmouseMoveEventmouseReleaseEvent方法。
將光標位置存儲在mousePressEvent中,並將小部件移動到mousePressEvent到光標從按下位置移動的距離。不要忘記清除mouseReleaseEvent中的光標位置。確切的代碼取決於小部件被拖動時的外觀以及其他小部件在拖放小部件時的行爲方式。在最簡單的情況下,它將如下所示:

void mousePressEvent(QMouseEvent* event) 
{  
    m_nMouseClick_X_Coordinate = event->globalX(); 
    m_nMouseClick_Y_Coordinate = event->globalY();  
}; 

void mouseMoveEvent(QMouseEvent* event) 
{ 
    if (m_nMouseClick_X_Coordinate < 0) 
    return; 

    const int distanceX = event->globalX() - m_nMouseClick_X_Coordinate; 
    const int distanceY = event->globalY() - m_nMouseClick_Y_Coordinate; 

    move(x() + distanceX, y() + distanceY()); 
}; 

void mouseReleaseEvent(QMouseEvent* event) 
{ 
    m_nMouseClick_X_Coordinate = -1; 
}