首页 > 其他分享 >Qt 动画类(QPropertyAnimation)

Qt 动画类(QPropertyAnimation)

时间:2024-05-29 13:57:27浏览次数:15  
标签:动画 Qt QPropertyAnimation 50 animation 设置 属性

前言
  QPropertyAnimation是QT中的一个动画类,用于对目标对象的属性进行动画效果展示。该类继承自QAbstractAnimation类,使用起来非常方便和灵活。

一、QPropertyAnimation类介绍
  QPropertyAnimation可以对任何QObject的子类的属性进行动画的展示,只要该属性是可写的,即存在set方法。QPropertyAnimation支持多种类型的属性,例如整型,浮点型,颜色等。要使用QPropertyAnimation,需要创建一个QPropertyAnimation对象,并通过setTargetObject方法将要动画显示的对象设置为目标对象,通过setPropertyName方法设置要动画显示对象的属性名。

  可以使用QVariant类型的setStartValue()和setEndValue()方法设置动画的起始值和结束值,也可以设置一个QValueSource类型的值源作为动画的值,通过setStartValueSource()和setEndValueSource()方法设置动画的值源。

  调用start函数开始执行动画,QPropertyAnimation能够自动计算动画的时间,执行时间和动画的重复次数等等。可以通过信号和槽机制来监测动画的进度和状态,例如valueChanged()信号可以获得动画实时的数值。

二、QPropertyAnimation使用例子

1.QPropertyAnimation修改QPushButton的pos属性
  这里给出平移一个按键的动画例子:

  下面的代码主要就是使用QPropertyAnimation来修改QPushButton类中的pos属性值让按键实现平移的效果。

1.创建QPushButton对象,并设置其初始位置。

1 QPushButton *pushButton = new QPushButton("Click me", this);
2 pushButton->setGeometry(50, 50, 100, 40);

2.创建QPropertyAnimation对象,并设置变化的属性、持续时间、起始值和结束值。

1 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "pos");
2 animation->setDuration(1000); // 设置动画持续时间为1秒
3 animation->setStartValue(QPoint(50,50)); // 设置起始位置为(50,50)
4 animation->setEndValue(QPoint(200, 50)); // 设置结束位置为(200,50),即向右平移150像素

3.启动动画。

animation->start();

完整的示例代码如下:

1 QPushButton *pushButton = new QPushButton("Click me", this);
2 pushButton->setGeometry(50, 50, 100, 40);
3 
4 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "pos");
5 animation->setDuration(1000); // 设置动画持续时间为1秒
6 animation->setStartValue(QPoint(50,50)); // 设置起始位置为(50,50)
7 animation->setEndValue(QPoint(200, 50)); // 设置结束位置为(200,50),即向右平移150像素
8 
9 animation->start(); // 启动动画

2.QPropertyAnimation修改QPushButton的geometry属性

  上面的第一个代码通过修改pos属性来达到动画的效果,同样的也可以通过修改geometry属性来达到动画的效果。

1 QPushButton *pushButton = new QPushButton("Click me", this);
2 pushButton->setGeometry(50, 50, 100, 40);
3 
4 QPropertyAnimation *animation = new QPropertyAnimation(pushButton, "geometry");
5 animation->setDuration(1000); // 设置动画持续时间为1秒
6 animation->setStartValue(QRect(50, 50, 100, 40)); // 设置起始位置和大小
7 animation->setEndValue(QRect(200, 50, 100, 40)); // 设置结束位置和大小,即横向向右平移150像素
8 
9 animation->start(); // 启动动画

三、QPropertyAnimation修改自定义属性
  除了修改QWidget和QGraphicsItem之类的内置属性之外,QPropertyAnimation还可以使用自定义属性。

自定义属性方式:

  在这里,我们使用了Q_PROPERTY宏来声明自定义属性。这个宏有三个参数:属性名、属性类型和可读可写属性的函数名称。

  通过READ和WRITE标识定义两个函数,功能分别是获取自定义属性的值和修改自定义属性的值。

  NOTIFY标识一个信号量,当自定义属性发生改变时可以发送这个信号量。

1     /*定义一个可读(READ)并且可写(WRITE)的属性,并且可以通过属性名称进行访问*/
2     Q_PROPERTY(int endAngle READ endAngle WRITE setEndAngle NOTIFY endAngleChanged)
3 
4 public:
5     int endAngle() const { return m_endAngle; }
6     void setEndAngle(const int& endAngle) { m_endAngle = endAngle; update(); }
7 
8 signals:
9     void endAngleChanged(int Angle);

使用:
  使用setStartValue可以设置属性的起始值,使用setEndValue设置结束值。

1     animation = new QPropertyAnimation(this, "endAngle");
2     animation->setDuration(500);
3     animation->setStartValue(0); // 属性的起始值
4     animation->setEndValue(100); // 属性的结束值
5     
6     // 启动动画
7     animation->start();

四、疑问点
  这里并没有显示的调用读取属性函数和设置属性函数,那么他们是怎么生效的呢?
  在上面的程序中我们使用的是QPropertyAnimation中的setStartValue函数和setEndValue函数来设置属性的起始值和属性的结束值,这样看起来是没有调用到我们自己定义的函数,其实调用这两个函数是会调用到我们自己设置的函数的。

解惑:

  setStartValue 函数会调用 MyWidget 中 endAngle 属性的 READ 函数,获取当前的 endAngle 值作为动画起始值。而 setEndValue 函数则直接调用 setEndAngle 函数,间接设置自定义属性的结束值。

总结
  在实际应用中,QPropertyAnimation可以让程序动态变得更加生动,提高用户的体验感,是一个非常有用的QT类。

标签:动画,Qt,QPropertyAnimation,50,animation,设置,属性
From: https://www.cnblogs.com/ybqjymy/p/18220104

相关文章

  • 【QT6】pycharm集成qt desinger(非anaconda等环境下)
    前言已经安装好了PyQT6,如果没有,请自行选择在项目或者全局打开cmd并输入:pipinstallPyQt6来进行安装!开始安装确定自己是否有安装pyside6,如果有,直接跳到下一步。。如果你没有安装过pyside6,任意地方打开cmd,输入:pipinstallpySide6安装完毕后,找到你python的安装目录:然后点进......
  • Qt UI界面组件介绍
    1.布局类(4种) 2.固定弹簧类(2种)(不随布局变化) 3.按钮类(6种) 4.容器类(10种)GroupBox类似于win7的日历框ToolBox类似于QQ的好友列表Tabwidget类似于 5.输入窗() 6.显示窗()......
  • 使用EMQX搭建MQTT服务
    简介:EMQX是一款开源的大规模分布式MQTT消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX5.0单集群支持MQTT并发连接数高达1亿条,单服务器的传输与处理吞吐量可达每秒百万级MQTT消息,同时保证毫秒级的低时延。EMQX支持多种协议,包括MQTT(3.1、3.1.1......
  • 西门子学习笔记3 - 工业物联网(MQTT协议服务器的搭建)
    这里使用的是公开测试的一个服务器(EMQX)的服务器EMQX是一款全球下载量超千万的开源物联网MQTT服务器,单集群支持1亿物联网设备连接,消息分发时延低于1毫秒,助力企业构建关键业务的IoT平台与应用。1、服务器文件的下载1、官方下载地址:免费下载、试用EMQ产品(emqx.com......
  • Adorner实现边框线条动画
    在WPF中,Adorner是一种特殊的装饰层,能够在UI元素之上绘制视觉效果。常用于提供视觉反馈或装饰功能,例如焦点指示、拖放效果等。自定义Adorne类要创建自定义Adorner,需要继承Adorner类并重写OnRender方法。在OnRender方法中,您可以使用DrawingContext绘制自定义图......
  • vue首屏加载动画打包后失效
    本地环境运行时,没有问题,打包后,加载动画没有效果,尝试修改:extract:false后成功。 加载动画示例:index.html中<linkrel="stylesheet"href="static/css/loading.css"/><body><divid="app"><divid="appLoading"><d......
  • Linux下Qt Creator无法输入中文(已解决)
    1.首先确保安装了搜狗输入法,且能正常运行。2.克隆源码到本地。gitclonehttps://gitcode.com/fcitx/fcitx-qt5.git3.检查QtCreator版本,如下图所示,为基于Qt6的。4.进入源码目录,建立build文件夹,修改CMakeLists.txt。cdfcitx-qt5/mkdirbuildviCMakeLists.txt 由......
  • Day1_QT界面设计
    1、创建登录界面2、创建注册界面3、实现需求:启动程序主界面优先显式登录界面,点击注册后跳转到注册界面点击注册按钮,就会发出一个信号,这个信号由switchRegister来接收,该信号发送给mainWindow来切换界面connect(ui->reg_btn,&QPushButton::clicked,this,&LoginDialog::sw......
  • QT | 文件读写过程中丢失的 OD OA 问题解决
    今天发现QT以文本方式(QIODevice::Text)写入二进制0x0A会出现问题,写入的是一个字节(实际应该是两个字节),结果在Zed上看,显示是2个字节。明显每个0x0A前都多了个0x0D,导致我的bin文件全部都错位了期望的效果应该是原来按照字节流的形式输出文本时,ofstream会自动将输......
  • Qt error: LNK1104: 无法打开文件“release\xxxxx.exe”报错解决方案
    一、问题重述出现这种报错一般是程序运行之后存在空指针问题,然后直接崩溃掉,下一次调试的时候就出现这种报错。如下图所示:二、原因分析出现这种情况是因为上次运行之后,程序的exe文件异常退出了,但是其实还在后台运行中,然后重新调试的时候exe被占用,所以QT编译器无法打开......