qt实现窗口拖动的两种思路

提要

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

你可能感兴趣的:(Qt)