关于Qt旋转图片的一些说明

我们在QT中加载图片一般都是将图片加载在一个label中显示,当我们想让这个label旋转时,就会出现问题,因为控件在不重写的情况下,基本旋转不了,我们只能去旋转label中的图片,达到旋转控件的效果,在网上查了很多资料但是很少有人能把写完整的,所以在这里记录下自己遇到这些问题时的一些心得吧。

       首先,我们了解一下QMatrix的知识。

QPainter预设的座标系统是绘图装置的座标系统,也就是左上角为原点,向右为正X,向下为正Y的座标系统,座标系统的转换常使用矩阵的方式来表现及进行运算, QMatrix的作用,正是让您可以利用其内建的矩阵,设定好相关的参数,然后让QPainter根据QMatrix的设定,来进行一些二维座标系统的转换动作。

QMatrix的内部使用一个3x3的矩阵:

 

m11

m12

0

m21

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和图片的宽高度一个属性设置为一样的值,旋转是以图片的中心点去旋转,这样就可以保证图片正常旋转。

      后续会提供相应的例子供大家参考。

 
 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值