提要
窗口按下鼠标不放拖动窗口移动,鼠标释放的时候,停止拖动。这个过程可以用两种方法来实现。
1.鼠标点击后,获取鼠标按下点的坐标和起初窗口左上角的坐标,用鼠标按下点的坐标减去鼠标左上角的坐标,求出这个固定值。鼠标移动时,获取鼠标的位置减去之前鼠标开始按下点与左上角的距离,得到窗口移动后左上角的坐标,使用move函数使窗口移动到当前位置。
2.鼠标点击后,获取鼠标按下点的坐标和起初窗口左上角的坐标,鼠标移动后,获取鼠标的位置减去鼠标刚开始按下的位置,求出移动的距离,用窗口左上角的坐标加上鼠标移动的距离。得到窗口移动后左上角的坐标,使用move函数使窗口移动到当前位置。
实现
先附上第一种实现的代码:
//参数类型说明,不涉及定义
QPoint m_offPos;//鼠标点击点与窗口左上角之间的距离void ResolutionDialog::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {QPoint startPos = event->globalPos();m_offPos = startPos - geometry().topLeft();}QDialog::mousePressEvent(event);
}void ResolutionDialog::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() == Qt::LeftButton) {QPoint endPos = event->globalPos();move(endPos - m_offPos);}QDialog::mouseMoveEvent(event);
}void ResolutionDialog::mouseReleaseEvent(QMouseEvent *event)
{QDialog::mouseReleaseEvent(event);
}
下面附上第二种窗口移动的实现代码:
void ResolutionDialog::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){m_beginPos = event->globalPos();m_leftTopPos = pos();//也可以使用geometry().topLeft()}QDialog::mousePressEvent(event);
}void ResolutionDialog::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons() == Qt::LeftButton){QPoint endPos = event->globalPos();QPoint offPos = endPos - m_beginPos;QPoint pos = m_leftTopPos + offPos;move(pos);}QDialog::mouseMoveEvent(event);
}void ResolutionDialog::mouseReleaseEvent(QMouseEvent *event)
{QDialog::mouseReleaseEvent(event);
}