本文共 1049 字,大约阅读时间需要 3 分钟。
在平时的项目中遇到了类似QQ宠物眼睛需要跟随鼠标,经过了简单的思索和查找资料,使用定时器加QCursor::pos()获取鼠标的全局坐标,并使用paintEvent来绘制旋转图。
使用QCursor::pos();获取鼠标绝对坐标,
WindowsPt_X和WindowsPt_Y 为相对检测点坐标 使用atan2(函数)来获取角度,使用C++库需要std:: 将角度转成1-180度这种单位。tmp*180/3.14,这个方法精度不高,但不需要太高精度。MousePt = QCursor::pos();//获取鼠标的绝对位置WindowsPt_X = WindowsPt_X+60;WindowsPt_Y = WindowsPt_Y+70;double tmp = std::atan2((this->MousePt.y()-WindowsPt_Y),(this->MousePt.x()-WindowsPt_X));Angle= tmp*180/3.14;
获取角度后可以使用rotate()函数来旋转图片,但需要使用translate()函数来改变所旋转坐标系的原点
之后通过painter.restore()恢复,与painter.save()保存的交替使用来实现效果。void MyLabel::paintEvent(QPaintEvent* e ){ QPainter painter(this);QPixmap pix,pix1;pix.load(":/20140526172329156.png");pix1.load(":/eye.png");painter.drawPixmap(0,0,100,100,pix);painter.save();painter.translate(0,0);painter.translate(30,30);painter.rotate(R);painter.translate(-30,-30);painter.drawPixmap(10,10,40,40,pix1);painter.restore();painter.save();painter.translate(65,30);painter.rotate(R);painter.translate(-65,-30);painter.drawPixmap(45,10,40,40,pix1);painter.restore();}
转载地址:http://cuewi.baihongyu.com/