QT 模仿Android游戏中虚拟摇杆(1)让摇杆跟着鼠标飞

来源:互联网 发布:噪声分析软件 编辑:程序博客网 时间:2024/05/22 09:46

最近的项目涉及到了这方面的内容,虽然是不值得一提的技术,但是好歹接触QT已经半年多了,早就想要动手写一些开发总结,今天算是为自己实现承诺。

要实现虚拟摇杆,首先应该自定义一个按钮,之所以要自定义按钮,是我没有在QT的QPushButton类中找到自带的move或者mousemove事件,虽然可以直接获取mouse的位置,但是这样的话就不方便实现两个以上的摇杆,所以还是决定自定义按钮。

自定义按钮,首先新建一个class,我命名为LeftButton,在这个类中,将其修改为继承自QPushButton,网上应该还是有挺多自定义按钮的方法的,我目的不在于讲述这个,所以跳过了,只要简单做一个按钮,功能是鼠标按下后,跟随鼠标按钮移动:

在自定义按钮的cpp文件中加入

voidLeftButton::mouseMoveEvent(QMouseEvent*e)

{

        QPointmovePos=cursor().pos();

        move(movePos);}

这里有一个问题,鼠标与摇杆会不能对齐,原因是QT获取的是相对于当前显示器的X、Y,而move是相对于当前窗体的,也就是说,如果分辨率400*400的显示器,当鼠标按下按钮,如果鼠标相对于屏幕是(100,100)的位置,则该按钮会移动到相对于程序窗体的(100,100)的位置上去,画出效果的话,相当于下图:

如果只是单纯在move事件中把当前鼠标的坐标赋值给摇杆,那么摇杆就会相对于程序窗体移动,但是鼠标是相对于整个屏幕的,所以会造成鼠标与摇杆无法对齐。

解决的办法就是下面代码:

voidLeftButton::mousePressEvent(QMouseEvent*e)
{
    windowPoint = e->globalPos() - this->pos();    
}
voidLeftButton::mouseMoveEvent(QMouseEvent*e)
{    QPoint bpoint=e->globalPos()-windowPoint;
    move(bpoint);}

翻阅了一些前辈的资料之后发现,globalPos获取的是相对于整个屏幕的坐标,而cursor.pos()得到是相对于窗体的坐标

用此方法,先在鼠标按下的时候获取到当前窗体相对于屏幕的位置windowPoint(原理的话,各种同学麻烦请自己想想),然后用鼠标相对屏幕的位置减去屏幕坐标,所得出来的,就是鼠标相对于屏幕的坐标,这样的话,直接调用move事件,摇杆就会跟着鼠标对齐了,今天就先讲到这里,有时间继续,谢谢浪费事件看这文章,如果有人看的话。

0 0
原创粉丝点击