qt怎么实现图片的向左旋转90度_Qt编写自定义控件33-图片切换动画

本文介绍了如何在Qt中实现图片向左旋转90度的动画效果,通过QPainter和QPropertyAnimation实现过渡动画,包括多种切换样式。文章提供核心代码,并展示了丰富的自定义控件功能,如多种样式、颜色、旋转速度等设置,适用于不同场景和系统。
摘要由CSDN通过智能技术生成

一、前言

在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗、透明度变化、左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各种动画效果对应的图片的区域动态计算并绘制出来,配合以QPropertyAnimation动画属性产生线性插值,比如渐入飞入时候,可以中间快速两端慢速。目前动画类型有9种,后期还会不断增加。

  1. 图像1渐渐变淡,图像2渐渐显现
  2. 百叶窗效果
  3. 图像从右向左翻转
  4. 从外到内水平分割
  5. 图像1从左至右退出可视区域,同时图像2从左至右进入可视区域
  6. 图像1从左至右退出可视区域,同时图像2从左至右进入可视区域
  7. 图像1从下至上退出可视区域,同时图像2从下至上进入可视区域
  8. 图像1从上至下退出可视区域,同时图像2从上至下进入可视区域
  9. 图像1不动,同时图像2从右下到左上

二、实现的功能

* 1:支持多种等待样式风格 圆弧状风格 旋转圆风格 三角圆弧 线条风格 圆环风格

* 2:可设置范围值和当前值

* 3:可设置前景色背景色

* 4:可设置顺时针逆时针旋转

* 5:支持任意大小缩放

* 6:支持设置旋转速度间隔

三、效果图

0267e69f9135d99803ec4bdbc5326a62.gif

四、核心代码

void ImageAnimation::paintEvent(QPaintEvent *){ if (pixmap1.isNull() || pixmap2.isNull()) { return; } QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); switch (animationType) { case 0: fadeEffect(&painter, geometry(), factor, pixmap1, pixmap2); break; case 1: blindsEffect(&painter, geometry(), factor, pixmap1, pixmap2); break; case 2: flipRightToLeft(&painter, geometry(), factor, pixma
旋转仪表盘是一种常见的显示控件,可以用来展示一些数据,如速、油量、温等,下面我将介绍如何使用Qt编写一个旋转仪表盘控件。 首先,我们需要在Qt中创建一个新的自定义控件类。可以通过Qt Creator中的“添加新文件”功能来创建一个QWidget派生类。在这个类中,我们需要实现paintEvent()函数来绘制仪表盘。 在paintEvent()函数中,我们可以使用QPainter来绘制仪表盘的各个部分,包括刻线、指针、文字等。具体实现可以参考以下代码: ```C++ void RotatingDial::paintEvent(QPaintEvent *event) { // 设置背景色 QPalette pal(palette()); pal.setColor(QPalette::Background, Qt::white); setAutoFillBackground(true); setPalette(pal); // 绘制刻线 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.translate(width() / 2, height() / 2); painter.setPen(QPen(Qt::black, 2)); for (int i = 0; i < 60; i++) { painter.drawLine(0, -100, 0, -90); painter.rotate(6); } // 绘制指针 painter.save(); painter.rotate(m_angle); painter.setBrush(Qt::red); painter.setPen(Qt::NoPen); painter.drawConvexPolygon(m_pointer, 3); painter.restore(); // 绘制文字 QFont font("Arial", 12, QFont::Bold); painter.setFont(font); painter.drawText(-30, 50, "Speed"); } ``` 在上面的代码中,我们首先设置了控件的背景色为白色。然后使用QPainter绘制了60条刻线,并旋转6。接着,我们绘制了一个红色的指针,并根据m_angle属性来旋转指针的角。最后,我们使用QPainter绘制了文字“Speed”。 在我们的自定义控件中,我们需要一个属性来控制指针的角。我们可以使用Q_PROPERTY宏来定义这个属性,例如: ```C++ class RotatingDial : public QWidget { Q_OBJECT Q_PROPERTY(int angle READ angle WRITE setAngle) public: RotatingDial(QWidget *parent = nullptr); int angle() const; void setAngle(int angle); private: int m_angle; QPolygon m_pointer; }; ``` 在上面的代码中,我们使用Q_PROPERTY宏定义了angle属性,并提供了getter和setter函数。我们还定义了一个私有变量m_angle来存储当前的角,以及一个QPolygon对象m_pointer来存储指针的形状。 在setAngle()函数中,我们设置m_angle属性,并根据新的角计算指针的位置: ```C++ void RotatingDial::setAngle(int angle) { if (angle != m_angle) { m_angle = angle; m_pointer.setPoint(0, QPoint(0, -90)); m_pointer.setPoint(1, QPoint(5, 0)); m_pointer.setPoint(2, QPoint(-5, 0)); m_pointer.translate(0, 100); update(); } } ``` 在上面的代码中,我们首先判断新的角是否与当前的角相同。如果不同,我们就更新m_angle属性,并重新计算指针的位置。最后,我们调用update()函数来触发paintEvent()函数的调用,从而完成控件的重绘。 最后,我们可以在MainWindow类中使用我们的自定义控件,例如: ```C++ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { RotatingDial *dial = new RotatingDial(this); dial->setAngle(30); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(dial); setCentralWidget(new QWidget); centralWidget()->setLayout(layout); } ``` 在上面的代码中,我们创建了一个RotatingDial对象,并设置了初始角为30。然后,将其添加到QHBoxLayout布局中,并设置为主窗口的中央控件。 至此,我们已经完成了一个简单的旋转仪表盘的自定义控件。你可以根据需要对其进行扩展和优化,使其更加适合你的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值