Qt的鼠标位置知多少

一个很傻的错误

要写一个很简单的软件,界面完全定制,没有标题栏,所以需要自己实现窗口拖动,然后我写下了一段很傻的代码

QPoint m_lastPos;

virtual void mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->pos();

    QMainWindow::mousePressEvent(event);
}

virtual void mouseMoveEvent(QMouseEvent *event)
{
    QPoint winPos = this->pos();
    QPoint pos = event->pos();
    winPos.setX(winPos.x() + pos.x() - m_lastPos.x());
    winPos.setY(winPos.y() + pos.y() - m_lastPos.y());
    this.setPos(winPos);

    QMainWindow::mouseMoveEvent(event);
}

本来我以为event的pos返回的是坐标是鼠标相对于屏幕左上角的,但是按照屏幕坐标系的话这个逻辑是不对的,但是其实pos函数返回的鼠标是相对于当前要拖动的窗口左上角的位置 ,阴差阳错的在windows下表现的很正常,打印日志后发现过程应该是这样的:

加入按下鼠标时,鼠标相对于当前窗口的位置是100,100,也就是说m_lastPos的值是[100,100],鼠标向右移动1个像素,那么mouseMoveEvent中event的pos返回的位置就是[101,100],此时按照以上逻辑计算后会将窗口向右移动1个像素,这样鼠标相对于窗口的位置就回到了鼠标按下时的位置,也就是仍然为[100,100],此时m

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值