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

本文介绍了如何通过两种方式实现窗口点击拖动:一是通过计算初始位置与鼠标移动的相对距离,二是直接记录鼠标开始位置并累加移动距离。两种方法的代码示例详细解释了实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提要

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值