• 全网最全!!Qt实现图片旋转及图片旋转动画的几种方式


    实现图片旋转的两种方式

    第一种方案

    使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下:

    1. QMatrix matrix;
    2. matrix.rotate(45);
    3. QLabel *Label= new QLabel();
    4. Label->setPixmap(QPixmap(“:/images.png”)
    5. .transformed(matrix, Qt::SmoothTransformation));

    第二种方案

    使用 QPainter 这位“画家”,示例程序如下:

    1. void Widget::paintEvent(QPaintEvent *)
    2. {
    3. QPainter painter(this);
    4. QPixmap disc(":/disc.png");
    5. /* 设定旋转中心点 */
    6. painter.translate(130,150);
    7. /* 旋转的角度 */
    8. painter.rotate(45);
    9. /* 恢复中心点 */
    10. painter.translate(-130,-150);
    11. /* 画图操作 */
    12. painter.drawPixmap(40,60,180,180, disc);
    13. }

     实现图片旋转动画的两种方式:

     一、借助QPixmap实现旋转动画

    1. QMatrix matrix;
    2. matrix.rotate(angle);
    3. if(angle++ ==360)
    4. angle = 0;
    5. //设定图片的大小;
    6. QImage Image = QImage(":/images/cd.png");
    7. QPixmap pixmap = QPixmap::fromImage(Image);
    8. QPixmap fixpixmap = pixmap.scaled(320,320,Qt::IgnoreAspectRatio
    9. ,Qt::SmoothTransformation);
    10. QLabel *Label= new QLabel();
    11. label[1]->setPixmap((fixpixmap)
    12. .transformed(matrix,Qt::SmoothTransformation));
    13. label[1]->setAlignment(Qt::AlignCenter);

    第二种方案

    使用 QPainter 这位“画家”,示例程序如下:

    1. MainWindow::MainWindow(QWidget *parent)
    2. : QMainWindow(parent)
    3. {
    4. disc = QPixmap(":/cd.png");
    5. timer = new QTimer();
    6. timer->start(10);
    7. connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeOut()));
    8. }
    9. void MainWindow::paintEvent(QPaintEvent *)
    10. {
    11. QPainter painter(this);
    12. /* 碟机转动 */
    13. if(angle++ == 360)
    14. angle = 0;
    15. /* 设定旋转中心点 */
    16. painter.translate(disc.width()/2,disc.height()/2);
    17. /* 旋转的角度 */
    18. painter.rotate(angle);
    19. /* 恢复中心点 */
    20. painter.translate(-disc.width()/2,-disc.height()/2);
    21. /* 画图操作 */
    22. painter.drawPixmap(0,0,disc.width(),disc.height(), disc);
    23. }
    24. void MainWindow::timerTimeOut()
    25. {
    26. /* 当界面初始化或者需要刷新时才会执行paintEvent */
    27. update();
    28. }

    使旋转动画始终处于窗口中心:

    1. void MainWindow::paintEvent(QPaintEvent *)
    2. {
    3. QPainter painter(this);
    4. painter.setRenderHints(QPainter::Antialiasing
    5. | QPainter::SmoothPixmapTransform);
    6. /* 碟机转动 */
    7. if(angle++ == 360)
    8. angle = 0;
    9. //设定旋转中心点
    10. /* QRectF 即,继承 QRect(Qt 的矩形类), F 代表精确到浮点类型 */
    11. QRect rect((this-> width() - disc.width()) / 2,
    12. (this-> height() - disc.height()) / 2,
    13. disc.width(),
    14. disc.height());
    15. /* 默认参考点为左上角原点(0,0),因为旋转需要以图形的中心为参考点,
    16. * 我们使用 translate 把参考点设置为 CD 图形的中心点坐标 */
    17. painter.translate(0 + rect.x() + rect.width() / 2,
    18. 0 + rect.y() + rect.height() / 2);
    19. /* 旋转的角度 */
    20. painter.rotate(angle);
    21. //恢复中心点;
    22. /* 现在参考点为 CD 图形的中心,我们需要把它设置回原点的位置,
    23. * 所以需要减去上面加上的数 即将绘图的起点设置回起点*/
    24. painter.translate(0 - (rect.x() + rect.width() / 2),
    25. 0 - (rect.y() + rect.height() / 2));
    26. //画图操作
    27. /* 画图,QPainter 提供了许多 drawX 的方法 */
    28. painter.drawPixmap(rect,disc);
    29. }

    最终效果: 

     

     

    参考:QT 实现图片旋转的两种方法 - 走看看 

  • 相关阅读:
    全国计算机四级之网络工程师知识点(二)
    小米路由器4A千兆版刷入OpenWRT并远程访问
    Redis五种基本数据类型-List
    树莓派4B安装ubuntu使用VNC连接
    Python爬虫基础之Selenium详解
    报错:“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
    m基于MATLAB-GUI的GPS数据经纬度高度解析与kalman分析软件设计
    linux不显示当前路径的解决方法
    162. 寻找峰值
    Markdown 字体变红色,2种办法
  • 原文地址:https://blog.csdn.net/weixin_46432495/article/details/126905119