窗口按下鼠标不放拖动窗口移动,鼠标释放的时候,停止拖动。这个过程可以用两种方法来实现。
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);
}