如何拖放自定义小部件?

时间:2013-12-08 12:20:24

标签: drag-and-drop qt5 qwidget qt4.8 qt5.1

我已经创建了自己的自定义小部件,我想支持小部件的内部拖放。

我在垂直框布局中添加了4个自定义小部件。现在我想在内部拖放自定义小部件。更清楚的是,如果我拖动最后一个小部件并将其放在第一个位置,则第一个小部件必须移动到第二个位置,最后一个小部件(被拖动)必须移动到第一个位置。 (与列表视图中项目的拖放一样)。任何人都可以建议我拖放自定义小部件的方法。enter image description here

1 个答案:

答案 0 :(得分: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;
}