2013-12-08 103 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; 
}