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(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下载

你可能感兴趣的:(QT,实战之控件介绍,python,开发语言)