如何拖放自定义小部件?

Posted

技术标签:

【中文标题】如何拖放自定义小部件?【英文标题】:How to Drag and Drop Custom Widgets? 【发布时间】:2013-12-25 12:57:59 【问题描述】:

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

我在垂直框布局中添加了 4 个自定义小部件。现在我想在内部拖放自定义小部件。更清楚地说,如果我拖动最后一个小部件并将其放在第一个位置,那么第一个小部件必须移动到第二个位置,最后一个小部件(被拖动)必须移动到第一个位置。 (与列表视图中的项目拖放相同)。谁能建议我一种拖放自定义小部件的方法。

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于如何拖放自定义小部件?的主要内容,如果未能解决你的问题,请参考以下文章