其实这是之前写的一个示例了,本来也做了很多项目,也打算陆陆续续的开源出来,欢迎大家共同学习探讨和交流,因为每个人都会在网上找资料,有的东西贡献出来大家都看r
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统一集中管理起来,这样方便后面点击的时候知道转动的位置。
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);
}
当双击某个进度条的时候就会执行旋转
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下载