近期在做一个qt项目,在用户选择头像图片后,需要将图片载入,并对其进行用户自定义裁剪。通过研究参照各流行软件的裁剪方式后,发现qq实现的裁剪比较好看,于是,我想那就做一个和qq相似的吧。先放一张qq实现的效果,然后最后再放我实现的效果。
1. 怎样去实现裁剪
对于一张载入的图片,要实现用户自定义裁剪,那么首先我需要有一个能够响应用户自由缩放的边框,当用户缩放到心仪大小,再摆到适当位置,我能知道框的位置及长宽,那么获取框里面的图片就很简单了。另外,我需要阴影,只有在框里面的图像部分是正常的,其他部分均被阴影覆盖。于是,实现该功能,大致需要两件东西,框及阴影。
框的实现可以定义无边框的窗口,如widget,frame,当一个窗口被定义为无边框时,那么该窗口势必无法再响应鼠标的拖动事件,也就是该边框将不能移动,也不能缩放,因此,我们需要重写鼠标事件,实现边框的拖动,以及自由缩放。
阴影的实现可以使用黑色的画笔,并设置透明度,去填充边框之外的区域。
2. 缩放边框的实现
要想缩放边框实现拖动及自由缩放,那么需要重写该边框的mousePressEvent、mouseMoveEvent、mouseReleaseEvent三个事件。具体见如下代码
2.1对mousePressEvent的重写
m_startPoint 用户记录鼠标点击下的事件, 而后期只需要算出移动时鼠标的坐标与初始坐标的差值,进行移动即可。代码如下:
void CutDialog::mousePressEvent(QMouseEvent * event)
{
m_startPoin