Qt如何实现子部件在父部件上移动拖动。
如上面例子,实现黄色子widget在橙色父widget上移动。
首先要确定子widget的parent是背景widget,然后需要在子widget中重载鼠标事件函数
在mouseMoveEvent函数中move自己的位置。
首先要理解move函数就是将widget的左上点移动到指定的位置。
在mouseMoveEvent函数中,需要确定图中4个点,上图表示子widget,
oldPoint是鼠标点在部件上的位置,初始时,mousePressEvent中获取的鼠标点击的位置。当部件移动时,oldPoint记录的是鼠标上次移动所在的位置。
e->pos 是指moseMoveEvent函数中获取的鼠标移动的位置。
TopLeft是widget的左上点的位置,也就是geometry().topLeft();
moveto所表示的点就是子widget所要移动到的点,也就是需要计算得到的点。
上面的关系滤清后,运用初中知识的值,在平面中,平行移动的距离是相等的,
moveto=e->pos - oldpoint + Topleft;
详细代码如下:
void PreviewToolButton::mousePressEvent(QMouseEvent *e) { if(e->button()==Qt::LeftButton) m_oldPoint=e->pos(); QWidget::mousePressEvent(e); } void PreviewToolButton::mouseMoveEvent(QMouseEvent *e) { QPoint oldPoint=m_oldPoint; QPoint moveToPoint=e->pos()-oldPoint+geometry().topLeft(); move(moveToPoint); oldPoint=moveToPoint; QWidget::mouseMoveEvent(e); } void PreviewToolButton::mouseReleaseEvent(QMouseEvent *e) { if(e->button()==Qt::LeftButton) m_bButtonPressed=false; QWidget::mouseReleaseEvent(e); }