当前位置: 首页 > news >正文

如何设计一个为QStackWidget的界面切换动画?

目录

前言

接口考虑

实现的思路


前言

笔者这段时间沉迷于给我的下位机I.MX6ULL做桌面,这里抽空更新一下QT的东西。这篇文章是跟随CCMoveWidget一样的文章,尝试分享自己如何书写这份代码的思考的过程

接口考虑

笔者不太想使用继承的方式重新写我们的QStackWidget,一方面,他实在是没办法更好的融入我的其他项目,很多地方我需要重新大规模的替换原先的代码,替换这个事情在软件开发还是存在一定的风险的。因此笔者选择做加法——让QStackWidget可以做动画(不需要的时候直接不使用接口函数即可)

总的来讲,笔者做出了这些抽象

#ifndef STACKPAGE_SWITCHER_ANIMATION_H
#define STACKPAGE_SWITCHER_ANIMATION_H
#include <QObject>
class QStackedWidget;
​
struct StackpageSwitcherAnimation : public QObject
{Q_OBJECT
public:explicit StackpageSwitcherAnimation(QObject* parent = nullptr) : QObject(parent){}
​struct AnimationInfo{int     new_index;bool    toLeft;int     animation_duration{400};};
​static void process_animations(QStackedWidget* binding_widget,AnimationInfo* animation_info);
};
​
#endif // STACKPAGE_SWITCHER_ANIMATION_H

可以看到还是很简单的一份接口,下面我来说一说实现

实现的思路

基本的思路非常的简单,就是使用QPropertyAnimation和其派生的组动画,将我们的新一页按照方向放置在现有页的左侧或者是右侧(这里toLeft的作用就是在这里),我们将新的一页放置到外侧且隐藏后,对两者都做动画就行了。

#include "stackpage_switcher_animation.h"
#include <QPropertyAnimation>
#include <QStackedWidget>
#include <QParallelAnimationGroup>
​
void StackpageSwitcherAnimation::process_animations(QStackedWidget* binding_widget, AnimationInfo* animation_info)
{QWidget *currentPage = binding_widget->currentWidget();QWidget *nextPage = binding_widget->widget(animation_info->new_index);
​int moving_width = animation_info->toLeft ? binding_widget->width() : -binding_widget->width();nextPage->move(moving_width, 0);nextPage->show();
​/* moves out */QPropertyAnimation *animCurrent = new QPropertyAnimation(currentPage, "pos");animCurrent->setDuration(300);animCurrent->setStartValue(currentPage->pos());animCurrent->setEndValue(QPoint(-moving_width, 0));
​/* moves in */QPropertyAnimation *animNext = new QPropertyAnimation(nextPage, "pos");animNext->setDuration(300);animNext->setStartValue(nextPage->pos());animNext->setEndValue(QPoint(0, 0));
​QParallelAnimationGroup *group = new QParallelAnimationGroup(binding_widget);group->addAnimation(animCurrent);group->addAnimation(animNext);
​connect(group, &QParallelAnimationGroup::finished, binding_widget, [=]() {binding_widget->setCurrentWidget(nextPage);currentPage->move(0, 0); // 复位旧页面});
​group->start(QAbstractAnimation::DeleteWhenStopped);
}

QParallelAnimationGroup在这里还是很简单的意思,那就是保证动画的同步开始和同步的结束。

这份代码是笔者目前用在项目中的,您可以自行更改学习研究!以上!

相关文章:

  • AI Agent 要用到的技术
  • /etc/kdump.conf 配置详解
  • backward梯度返回顺序要求(forward的输入、backward的输出)
  • 2025年中国光电子器件产业链分析
  • 大模型基础(五):transformers库(下):快速分词器、自动配置类、快速微调
  • 认识并理解什么是链路层Frame-Relay(帧中继)协议以及它的作用和影响
  • Spring-使用Java的方式配置Spring
  • 每日c/c++题 备战蓝桥杯(P1886 滑动窗口 /【模板】单调队列)
  • 大模型推理框架简介
  • 微前端qiankun动态路由权限设计与数据通信方案
  • 反常积分(广义积分)
  • 机器学习模型训练模块技术文档
  • XZ03_Overleaf使用教程
  • 名词解释DCDC
  • Wannier90文件与参数
  • Three.js + React 实战系列 - 项目展示区开发详解 Projects 组件(3D 模型 + 动效 + 状态切换)✨
  • DeepSeek技术发展详细时间轴与技术核心解析
  • 【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
  • 人工智能浪潮中Python的核心作用与重要地位
  • DeepSeek成本控制的三重奏
  • 重温经典|中国首部剪纸动画片《猪八戒吃瓜》创作始末
  • 被炒热的“高潮针”:超适应症使用,安全性和有效性存疑
  • 贵州游船侧翻248名消防员已在搜救
  • 电商平台集体出手,多措并举助力外贸企业拓内销
  • 澎湃读报丨央媒头版五四青年节集中刊文:以青春之我,赴时代之约
  • 多地晒五一假期前两日成绩单,湖南单日客流同比增长逾三成