Qt 之转盘实现C++语言

一、效果如下

 二、转盘

1.简介

其实这是之前写的一个示例了,本来也做了很多项目,也打算陆陆续续的开源出来,欢迎大家共同学习探讨和交流,因为每个人都会在网上找资料,有的东西贡献出来大家都看r

2.初始化转盘

void turn::SktSetVal()
{
	SKT_RE_TU_ST stReTuItem;
	for (int i = 0; i < 17; i++)
	{
		if (0 == i)
		{
			stReTuItem.iSbr		= i;
			stReTuItem.pWdt		= ui.wt0;
			stReTuItem.pBar		= NULL;
			stReTuItem.pQpa		= NULL;
			stReTuItem.ix		= ui.wt0->pos().rx();
			stReTuItem.iy		= ui.wt0->pos().ry();
		}
		if (1 == i)
		{
			stReTuItem.iSbr		= i;
			stReTuItem.pWdt		= ui.wt1;
			stReTuItem.pBar		= ui.pbar1;
			stReTuItem.ix		= ui.wt1->pos().rx();
			stReTuItem.iy		= ui.wt1->pos().ry();
			stReTuItem.pQpa		= new QPropertyAnimation(ui.wt1, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar1->installEventFilter(this);
		}
		if (2 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt2;
			stReTuItem.pBar = ui.pbar2;
			stReTuItem.ix	= ui.wt2->pos().rx();
			stReTuItem.iy	= ui.wt2->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt2, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar2->installEventFilter(this);
		}
		if (3 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt3;
			stReTuItem.pBar = ui.pbar3;
			stReTuItem.ix	= ui.wt3->pos().rx();
			stReTuItem.iy	= ui.wt3->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt3, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar3->installEventFilter(this);
		}
		if (4 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt4;
			stReTuItem.pBar = ui.pbar4;
			stReTuItem.ix	= ui.wt4->pos().rx();
			stReTuItem.iy	= ui.wt4->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt4, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar4->installEventFilter(this);
		}
		if (5 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt5;
			stReTuItem.pBar = ui.pbar5;
			stReTuItem.ix	= ui.wt5->pos().rx();
			stReTuItem.iy	= ui.wt5->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt5, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar5->installEventFilter(this);
		}
		if (6 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt6;
			stReTuItem.pBar = ui.pbar6;
			stReTuItem.ix	= ui.wt6->pos().rx();
			stReTuItem.iy	= ui.wt6->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt6, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar6->installEventFilter(this);
		}
		if (7 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt7;
			stReTuItem.pBar = ui.pbar7;
			stReTuItem.ix = ui.wt7->pos().rx();
			stReTuItem.iy = ui.wt7->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt7, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar7->installEventFilter(this);
		}
		if (8 == i)
		{
			stReTuItem.iSbr = i;
			stReTuItem.pWdt = ui.wt8;
			stReTuItem.pBar = ui.pbar8;
			stReTuItem.ix = ui.wt8->pos().rx();
			stReTuItem.iy = ui.wt8->pos().ry();
			stReTuItem.pQpa = new QPropertyAnimation(ui.wt8, "geometry");
			stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
			stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);
			ui.pbar8->installEventFilter(this);
		}

		m_mapJxReTu.insert(std::pair<int, SKT_RE_TU_ST>(i, stReTuItem));
	}
}

其实初始化转盘就是记录一下各个要转动的控件的位置,设置一下转动的速度,注册一下控件的点击事件等,然后用一个MAP统一集中管理起来,这样方便后面点击的时候知道转动的位置。

3.又击事件

bool turn::eventFilter(QObject *obj, QEvent *evn)
{
	if ((obj == ui.pbar1) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_1);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar2) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_2);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar3) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_3);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar4) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_4);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar5) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_5);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar6) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_6);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar7) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_7);
		return QWidget::eventFilter(obj, evn);
	}
	if ((obj == ui.pbar8) && (evn->type() == QEvent::MouseButtonDblClick))
	{
		SktPBarClicked(SKT_PBAR_EN::SKT_BAR_8);
		return QWidget::eventFilter(obj, evn);
	}


	return QWidget::eventFilter(obj, evn);
}

当双击某个进度条的时候就会执行旋转

4.执行旋转

void turn::SktPBarClicked(SKT_PBAR_EN enBar)
{
	//int iEx = ui.wt0->pos().rx();
	//int iEy = ui.wt0->pos().ry();

	SKT_RE_TU_MAP::iterator iter;
	SKT_RE_TU_MAP::iterator itor;
	int iNext = 0;
	int i = (int)enBar;
	for (i; i < 9; i++)
	{
		if (8 == i)
		{
			iter = m_mapJxReTu.find(i);
			if (iter == m_mapJxReTu.end())
			{
				break;
			}
			iNext = 1;
			itor = m_mapJxReTu.find(iNext);
			if (itor == m_mapJxReTu.end())
			{
				break;
			}
		}
		else {
			iter = m_mapJxReTu.find(i);
			if (iter == m_mapJxReTu.end())
			{
				break;
			}
			iNext += i + 1;
			itor = m_mapJxReTu.find(iNext);
			if (itor == m_mapJxReTu.end())
			{
				break;
			}
		}

		int iSx = iter->second.pWdt->pos().rx();
		int iSy = iter->second.pWdt->pos().ry();
		int iEx = itor->second.pWdt->pos().rx();
		int iEy = itor->second.pWdt->pos().ry();

		iter->second.pQpa->setStartValue(QRect(iSx, iSy, 500, 0));
		iter->second.pQpa->setEndValue(QRect(iEx, iEy, 0, 0));
		iter->second.pQpa->start();

		iNext = 0;
	}

	i = (int)enBar - 1;
	for (int k = i; k > 0; k--)
	{
		iter = m_mapJxReTu.find(k);
		if (iter == m_mapJxReTu.end())
		{
			break;
		}

		iNext += k + 1;
		itor = m_mapJxReTu.find(iNext);
		if (itor == m_mapJxReTu.end())
		{
			break;
		}

		int iSx = iter->second.pWdt->pos().rx();
		int iSy = iter->second.pWdt->pos().ry();
		int iEx = itor->second.pWdt->pos().rx();
		int iEy = itor->second.pWdt->pos().ry();

		iter->second.pQpa->setStartValue(QRect(iSx, iSy, 500, 0));
		iter->second.pQpa->setEndValue(QRect(iEx, iEy, 0, 0));
		iter->second.pQpa->start();

		iNext = 0;

	}

}

为什么有两个循环,其实第一个循环差不多只是转了半圈,将当前右边控件都转一遍,然后用第二个循环把当前点击的左边转完,这样就把整个转盘都转了一圈。


总结

其实实现起来还是蛮简单的,也就用了QT的QPropertyAnimation类
stReTuItem.pQpa = new QPropertyAnimation(ui.wt8, "geometry");
stReTuItem.pQpa->setEasingCurve(QEasingCurve::BezierSpline);
stReTuItem.pQpa->setDuration(SKT_REAG_EXE_SPEED);

然后通过以上三个函数将要移动的widget放到QPropertyAnimation里面

iter->second.pQpa->setStartValue(QRect(iSx, iSy, 500, 0));
iter->second.pQpa->setEndValue(QRect(iEx, iEy, 0, 0));
iter->second.pQpa->start();

最后通过这三个函数完成移动,简单来说就是从什么地方移动,移动到哪里去,最后调start开始移动,非常简单粗暴快捷。

只是多个widget同时移动的时候需要算知道所有widget的位置,其实也好办,C++一个MAP就搞定了。

开源代码,欢迎大家下载,不需要积分

QT实现的一个转盘工具示例-QT文档类资源-CSDN下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种用于编写高效、可靠的系统软件的编程语言,而Qt是一个跨平台的应用程序开发框架,可以用来创建图形用户界面(GUI)和实现应用程序逻辑。 实时任务调度仿真软件是一种用于模拟和评估实时任务调度算法的工具。下面我们将给出一个关于如何使用C语言Qt实现这样的软件的概要步骤。 首先,我们可以使用C语言实现实时任务调度算法的核心逻辑。这涉及到定义任务和调度器的数据结构,以及相应的算法和函数来进行任务调度。通过C语言的低级别访问能力,我们可以利用底层硬件资源来模拟实时任务的执行和调度。 然后,我们可以将C语言实现Qt的图形界面框架结合起来,以实现用户友好的用户界面。Qt提供了丰富的界面元素和布局管理器,使我们能够设计和组织仿真软件的窗口、按钮、输入框等用户界面元素。我们可以使用Qt的信号和槽机制来实现用户界面与任务调度模拟的交互逻辑。 最后,我们可以通过编译和构建C语言Qt的代码,生成可执行文件或者库文件,供用户使用。用户可以通过界面上的控件来设置任务的属性,如优先级、执行时间等,并通过模拟按钮来启动任务调度仿真。同时,仿真软件还可以输出仿真结果,如任务的执行顺序和调度延迟等,供用户进行分析和评估。 总之,通过使用C语言Qt,我们可以实现一个实时任务调度仿真软件,该软件不仅提供了高效、可靠的任务调度算法实现,还拥有用户友好的图形界面,方便用户进行任务调度的模拟和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值