我们在QT中加载图片一般都是将图片加载在一个label中显示,当我们想让这个label旋转时,就会出现问题,因为控件在不重写的情况下,基本旋转不了,我们只能去旋转label中的图片,达到旋转控件的效果,在网上查了很多资料但是很少有人能把写完整的,所以在这里记录下自己遇到这些问题时的一些心得吧。
首先,我们了解一下QMatrix的知识。
QPainter预设的座标系统是绘图装置的座标系统,也就是左上角为原点,向右为正X,向下为正Y的座标系统,座标系统的转换常使用矩阵的方式来表现及进行运算, QMatrix的作用,正是让您可以利用其内建的矩阵,设定好相关的参数,然后让QPainter根据QMatrix的设定,来进行一些二维座标系统的转换动作。
QMatrix的内部使用一个3x3的矩阵:
m12 | 0 | |
m22 | 0 | |
dx | dy | 1 |
dx与dy定义了水平与垂直移动,m11与m22定义了水平与垂直缩放(scaling),m12与m21定义了垂直与水平扭曲(shearing),想像您是坐在太空船中,在太空船从左上原点开到某个点之后,(x, y)是以您为中心所看到的座标,但实际上太空船相对于左上角为原点的座标为(x', y'),QMatrix的矩阵可以如以下的公式,将(x, y)转换为(x', y'):
x' = m11*x + m21*y + dx
y' = m22*y + m12*x + dy
当您使用QPainter要进行绘图时,可以您为中心所看到的座标系统(x, y),使用QPainter的相关API来进行相关图形的绘制,这就像您在太空船中画图一样的方便,若有设定QMatrix,则会自动转换为电脑绘图时所看到的座标系统(x', y'),如此就不用亲自进行一些复杂的转换动作,进行绘图时也较为直觉。
我的程序是利用QMatrix的函数做的旋转。具体调用如下:
void myRotate()
{
//要旋转的图片
QPixmap src_pix;
//旋转角度
int nDegree;
//中心点
int centre_x;
int centre_y;
QMatrix mat;
//设置旋转图片时的中心点
mat.translate(centre_x, centre_y);
//设置图片旋转角度
mat.rotate(nDegree);
//将图片旋转中心点放回图片的左上角
mat.translate(-centre_x, -centre_y);
//新建一张图片,并设置背景透明
QPixmap new_pix;
new_pix.fill(Qt::transparent); //设置透明
new_pix = src_pix.transformed(mat, Qt::SmoothTransformation);
//在图片画线
Qpainter paint(&new_pix);
//选择画笔
QPen pen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
//起始点 和 终点
QPoint start_pt, end_pt;
paint.drawLine(start_pt, end_pt);
}
看到这里是不是觉得跟网上你查到的内容都是一样的,并没有不一样的地方,其实差别在我们设置的label属性上,如果我们设置label的scaledContents属性,图片会在label上做一些延伸,导致我们旋转图片时,图片会失帧变形,如果想保证图片不失帧不变形的旋转,我们就不要勾选scaledContens这个属性,将label和图片的宽高度一个属性设置为一样的值,旋转是以图片的中心点去旋转,这样就可以保证图片正常旋转。
后续会提供相应的例子供大家参考。