Qt小动画之实现控件上下移动

Qt编写可拖拽的自定义控件 qt实现的可自定义拖拽控件 阅读详情

一、简述

2020已经过去,迎来了2021,时间过的真快呀,好久没有在csdn上写博客了,也没有再给大家分享更多好玩有趣的Code,那么今天就给大家分享一个之前写的一个小动画示例。

二、代码之路

下图是实现效果图,主要思路是使用两个动画对象,操作上下需要移动的控件即可。

在这里插入图片描述

MoveWidget::MoveWidget(QWidget *parent)
	: QWidget(parent)
	, m_currentWidget(nullptr)
{
	initMenu();
	initAnimation();
	this->setFixedWidth(400);
	simulateWidget();
}

MoveWidget::~MoveWidget()
{
}

void MoveWidget::addWidget(QWidget* widget)
{
	m_widgetList.append(widget);
	widget->setParent(this);
}

void MoveWidget::updateWidgetPos()
{
	int totalHeight = 0;
	for (int i = 0; i < m_widgetList.count(); i ++)
	{
		QWidget* widget = m_widgetList[i];
		widget->move(QPoint(0, totalHeight));
		totalHeight += widget->height();
	}

	// 当没有添加任何控件的时候,这里可以自行设置默认高度;
	if (totalHeight == 0)
	{
		totalHeight = 100;
	}
	this->setFixedHeight(totalHeight);
}

void MoveWidget::initMenu()
{
	m_menu = new QMenu(this);
	QAction* moveUpAction = m_menu->addAction("上移");
	QAction* moveDownAction = m_menu->addAction("下移");
	QAction* moveDeleteAction = m_menu->addAction("删除");

	connect(moveUpAction, &QAction::triggered, this, &MoveWidget::onMoveUpWidget);
	connect(moveDownAction, &QAction::triggered, this, &MoveWidget::onMoveDownWidget);
	connect(moveDeleteAction, &QAction::triggered, this, &MoveWidget::onDeleteWidget);
}

void MoveWidget::initAnimation()
{
	m_moveUpAnimation = new QPropertyAnimation(this, "Up");
	// 设置动画时长;
	m_moveUpAnimation->setDuration(1000);
	// 设置动画变化类型;
	m_moveUpAnimation->setEasingCurve(QEasingCurve::OutQuad);
	connect(m_moveUpAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value) {
		m_moveUpWidget->move(QPoint(0, value.toInt()));
	});

	m_moveDownAnimation = new QPropertyAnimation(this, "Down");
	m_moveDownAnimation->setDuration(1000);
	m_moveDownAnimation->setEasingCurve(QEasingCurve::Linear);
	connect(m_moveDownAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value) {
		m_moveDownWidget->move(QPoint(0, value.toInt()));
	});
}

void MoveWidget::simulateWidget()
{
	// 测试数据;
	QWidget* widget1 = new QWidget;
	widget1->setFixedSize(QSize(400, 200));
	widget1->setStyleSheet("background:red");

	QWidget* widget2 = new QWidget;
	widget2->setFixedSize(QSize(400, 100));
	widget2->setStyleSheet("background:yellow");

	QWidget* widget3 = new QWidget;
	widget3->setFixedSize(QSize(400, 250));
	widget3->setStyleSheet("background:blue");

	QWidget* widget4 = new QWidget;
	widget4->setFixedSize(QSize(400, 200));
	widget4->setStyleSheet("background:black");

	addWidget(widget1);
	addWidget(widget2);
	addWidget(widget3);
	addWidget(widget4);

	updateWidgetPos();
}

void MoveWidget::mouseReleaseEvent(QMouseEvent *event)
{
	if (Qt::RightButton == event->button())
	{
		QPoint mousePoint = event->pos();
		m_currentWidget = nullptr;
		for (int i = 0; i < m_widgetList.count(); i++)
		{
			QWidget* widget = m_widgetList[i];
			QRect rect = widget->rect().translated(widget->pos());
			if (rect.contains(mousePoint))
			{
				m_currentWidget = m_widgetList[i];
				break;
			}
		}
		m_menu->exec(this->mapToGlobal(mousePoint));
	}
}

void MoveWidget::onMoveUpWidget()
{
	int index = m_widgetList.indexOf(m_currentWidget);
	if (index > 0 && m_widgetList.count() > 1)
	{
		m_moveUpWidget = m_currentWidget;
		m_moveDownWidget = m_widgetList[index - 1];

		m_widgetList[index - 1] = m_moveUpWidget;
		m_widgetList[index] = m_moveDownWidget;

		m_moveUpAnimation->setStartValue(m_moveUpWidget->pos().y());
		m_moveUpAnimation->setEndValue(m_moveDownWidget->pos().y());

		m_moveDownAnimation->setStartValue(m_moveDownWidget->pos().y());
		m_moveDownAnimation->setEndValue(m_moveDownWidget->pos().y() + m_moveUpWidget->height());

		m_moveUpWidget->raise();
		m_moveUpAnimation->start();
		m_moveDownAnimation->start();
	}
}

void MoveWidget::onMoveDownWidget()
{
	int index = m_widgetList.indexOf(m_currentWidget);
	if (index >= 0 && m_widgetList.count() > 1 && index != m_widgetList.count() - 1)
	{
		m_moveUpWidget = m_widgetList[index + 1];
		m_moveDownWidget = m_currentWidget;

		m_widgetList[index + 1] = m_moveDownWidget;
		m_widgetList[index] = m_moveUpWidget;

		m_moveUpAnimation->setStartValue(m_moveUpWidget->pos().y());
		m_moveUpAnimation->setEndValue(m_moveDownWidget->pos().y());

		m_moveDownAnimation->setStartValue(m_moveDownWidget->pos().y());
		m_moveDownAnimation->setEndValue(m_moveDownWidget->pos().y() + m_moveUpWidget->height());

		m_moveDownWidget->raise();
		m_moveUpAnimation->start();
		m_moveDownAnimation->start();
	}
}

void MoveWidget::onDeleteWidget()
{
	int index = m_widgetList.indexOf(m_currentWidget);
	if (index >= 0)
	{
		m_widgetList.removeOne(m_currentWidget);
		m_currentWidget->setParent(nullptr);
		m_currentWidget->deleteLater();
		m_currentWidget = nullptr;
		updateWidgetPos();
	}
}

Qt 动画:动画框架 类名功能介绍QAbstractAnimation 动画基类提供基本的动画属性和接口,它有两个子类 QVariantAnimation 和 QAnimationGroup。QAbstractAnimation 是其他所有类的父类。它提供了基础的属性,适用于所有的本框架下的动画。QPropertyAnimation 实际的动画类实现了一个 Qt 动画属性,比如对控件的大小缩放、位置移动、透明度变化的动画效果实现。 阅读详情

相关推荐

别再只写界面了!用Qt QGraphicsView和QPropertyAnimation制作一个流畅的2D小动画

本文详细介绍了如何利用Qt的QGraphicsView和QPropertyAnimation框架制作流畅的2D动画。通过实战案例,展示了从基础图元构建到复杂动画效果实现的完整流程,包括弹跳球动画、性能优化技巧以及交互式动画设计,帮助开发者提升GUI应用的动态视觉效果和用户体验。

weixin_30887919的博客 325

Qt动画的简单使用(QPropertyAnimation,含源码和注释)

一、Qt动画示例图(移动、缩放、不透明度) 下图为使用不同属性实现的效果(源码在本文第四节) 二、什么是Qt动画 QPropertyAnimation是Qt自带的动画类,该类可以实现简单的控件动画效果,比如对控件的移动、缩放、不透明度这些来做动画效果(使用某效果之前需要使用setPropertyName函数指定需要的动画属性名,以下三个是Qt已经定义好的)。 移动(pos):主要实现移动效果,如从某个点移动到另一个点,所使用的变量类型为QPoint等。 缩放(geometry):可实现缩放和移动效果,该

lw的博客 1万+

QListWidget 实现控件内拖拽

Qt控件拖拽

人和代码有一个能跑 1407

Qt实现窗口移动动画

//头文件声明animation QPropertyAnimation *animation //cpp类文件里实现,50ms后执行slot showout() animation = new QPropertyAnimation(this, "geometry"); animation->setDuration(1000); QTimer::singleShot(50,this,SLOT(showOut())); //showOut的实现: void showOut() { s...

amu1550的专栏 1356

Qt动画:移动动画效果 -> Qt动画:平滑的位移效果

接着,我们设置了动画的持续时间为1秒,并指定了该动画的起始值和结束值。在本例中,我们将创建一个QPropertyAnimation对象,以对QWidget对象的geometry属性进行动画操作。本文将介绍如何使用Qt中的QPropertyAnimation类来实现平滑的位移动画效果,并提供相应的源代码。总结一下,通过使用QPropertyAnimation类,我们可以轻松实现平滑的位移动画效果。在实际应用中,我们可以根据需求对动画的持续时间、起始值和结束值进行调整,以达到更加满意的动画效果。

CyberWizarDD的博客 1449

c++大作业,模拟实现传统rpg游戏口袋妖怪(c++ + qt)

由于代码量较大解释起来较复杂所以,这里就不具体解释了,完整代码在最上面的文档中。需要具体解释的可以评论留言,后面我也会慢慢完善,再上传。

lhit3的博客 1418

《Qt 自定义控件设计:模拟 QCheckBox 的动效开关按钮》

提示:本设计使用的是【Qt4 设计师自定义控件】,这样可以集成到Qt Desinger中,不知道这项目模板的可以跳转此处。背景:使用自带QCheckBox时,觉得不够好看,如果直接改变qss又觉得调整不到自己想要的效果,于是有了本篇讲述的CtmSwitchButton。目标:设计出一个可以发出on/off基本信号的按钮,并且实现一些小动画和自定义属性(颜色)

phshp的博客 1467

RYU+Mininet的SDN架构-设计校园网络(一)

现有一个中学,需要设计一个中小型网络满足学校的网络需求。学校有教学区,实验室区域和服务器区域。教学区为了满足接入的灵活性和信号强度要求,需要满足设计WIFI满足日常教室和同学需求,接入上限为200人。实验室区域需要有一台教师主机方便管理实验室其余电脑,并且教师主机可以访问学校服务器,方便为同学们实验室授课。学校服务器区域设有学校相关重要文件和学校网页相关内容。最后学校还会接入互联网。

weixin_53284122的博客 8034

Qt-4.6动画Animation快速入门三字决

Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。 所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情。当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提...

weixin_34198797的博客 168

深入解析ROS 2 Control:从硬件抽象到实时控制的机器人框架实践

本文深入解析了ROS 2 Control机器人控制框架,阐述了其如何通过硬件抽象、控制器管理和实时性保障,解决机器人开发中硬件与软件紧耦合的痛点。文章详细剖析了其三层核心架构与数据流,并通过C++/Python代码示例演示了硬件接口的实现,最后提供了URDF配置、启动文件编写指南以及动态控制器管理、实时优化等高级应用与实战避坑技巧。

mqtt6iot的博客 620

安时积分法和开路电压法结合估算锂电池SOC

基于安时积分法和开路电压法结合的锂电池SOC估计Simulink仿真建模,利用安时积分法计算放电过程中的SOC,在搁置状态利用开路电压法进行SOC修正。

qq_39304296的博客 2554

qt同时两个动画执行_Qt-新增了Animation Framework(动画框架)

|Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。前面写过一篇文章Qt动画效果的幕后英雄:QTimeLine,介绍了怎么利用QTimeLine写一动画程序。今天又再重申前文里的一句话,所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义...

weixin_39819327的博客 247

EDA虚拟机分享2020版本(Synopsys2020)

EDA虚拟机分享

亦安的数字小站 9190

QT动画三步决

<br />Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。<br /><br /><br />第一决:QPropertyAnimation<br />QPropertyAnimation用于和QObject中的属性properties进行通信,比如QWidget的大小,坐标等。来看代码<br />QPropertyAnimation *animatio

crazy_sparrow的专栏 1530

Challenge 6 - OSCP C

开放了161端口,直接snmpbulkwalk扫描得到账号密码试了那几个web端口,发现可以登录8083的vesta,但是需要用户名大写Jack接着登录之后里面可以创建计划任务,直接弄个反弹shell,一分钟回弹。得到shell后,运行linpeas.sh提供了几个可能的漏洞,挨个试一下。

羽的博客 4134

内存泄漏系列专题分析之二十一:高通相机CamX内存泄漏&内存占用分析--GPU内存拆解

通过上述debug方式,可以看到patch补丁可以顺利debug各种ION内存分布,可以通过它分析ION内存占用问题。同时我们还可以分析GPU内存泄漏问题,同样的方式可以看到所有的GPU内存分布,如果某个GPU内存持续增长,就极有可能内存泄漏,然后更具堆栈信息去分析代码,并解决GPU内存泄漏问题。!!

454

Qt 动画入门

Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。    所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情。当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提供了QStateMachine...

weixin_42489835的博客 345

40.8K星爆火!Crawl4AI实战突破Cloudflare 5秒盾:AI反爬新范式,爬虫再也不被封

Crawl4AI的爆火(40.8K星)不是偶然——它解决了爬虫工程师最头疼的反爬问题,让爬虫从“体力活”变成“脑力活”,不用再花费大量时间配置指纹、编写行为脚本。但要注意:爬虫必须遵守目标网站的robots.txt协议,不得用于非法爬取数据(比如用户隐私、商业机密)。合理使用技术,才能长久落地。如果你在使用Crawl4AI时遇到具体问题(比如绕过更严格的反爬、批量爬取配置),欢迎在评论区交流,我会第一时间分享解决方案!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1603

qt动画入门

Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序。不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞。     所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情。当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提供了QStateMachi

思索的IT脚印 1448

【2023年】云计算比赛——金砖挑战赛正式题

文章摘要 本文详细记录了OpenStack私有云平台与Kubernetes容器云平台的部署与运维过程,涵盖环境初始化、组件安装、服务配置及自动化运维等关键任务。主要内容包括: OpenStack部署 环境初始化(主机名、Yum源、FTP服务等) 核心组件安装(Keystone、Glance、Nova、Neutron等) 运维任务(安全组管理、镜像上传、存储服务配置等) Kubernetes集群搭建 节点配置(时间同步、免密登录) 容器运行时(Docker)与网络插件(Flannel)部署 Harbor私有仓

geekgold的博客 313

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QT利用button控制小球上下左右移动

widget.h#ifndef WIDGET_H #define WIDGET_H #include &lt;QWidget&gt; #include &lt;QTimer&gt; namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(Q...

NBDR_YL的博客 5160

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Qt设置label的文字自动换行、高度随内容调整、上下可滚动

Qt初学者,想要用label控件实现一个用于显示文字信息的文本框,要求文字自动换行、label高度随内容调整、上下可滚动。 为了实现滚动,使用ScrollArea控件,将要显示文字的label放到这个ScrollArea里,然后设置ScrollArea的布局(水平或竖直都可,根据自己需要),这样的话label就能占满整个ScrollArea了。 实现自动换行,可以在ui designer设置: 或者代码设置: ui->label0->setWordWrap(true); 实现高度随内容调整:

FFXN的博客 8063

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Qt之实现移动的方块(蚂蚁线)
下一篇: QTreeWidget隐藏节点的两种方式
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值