一、效果如下

二、转盘

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

Qt 之转盘实现C++语言相关推荐

  1. Qt Quick的多国语言翻译

    一.翻译Qt Quick应用软件 1.对所有用户界面中的文字字符串使用qsTr() QML中的字符串可以使用qsTr().qsTranslate().qsTrId().QT_TR_NOOP().QT_ ...

  2. Qt中,软件多语言国际化翻译的方法与步骤

    Qt中,软件多语言国际化翻译的方法与步骤 在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作.虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法 ...

  3. QT学习:多国语言国际化

    一.国际化支持的实现 (1)使用QString对象表示所有用户可见的文本.由于QString内部使用Unicode编码实现,所以它可以用于表示所有需要向用户呈现的文本.当然,对于仅程序员可见的文本并不 ...

  4. C语言程序可以放到qt,初学Qt之--在Qt中调用外部C语言模块

    调用外部已编译好的C语言模块,传递参数并将结果返回打印出来. C语言模块代码: /**********Test.c**********/ /**********用gcc编译后生产那个的可执行文件tes ...

  5. QT QTranslator 中英文翻译linguist语言家 翻译过程

    1.QT项目中,.pro文件内添加如下代码 TRANSLATIONS += test_zh.ts test_zh是自己起的名字,名字部分可以修改(一般中文为zh,英文为en) .ts是后缀,后缀不能改 ...

  6. qt中的纯c语言中项目,2使用QT新建c工程

    1.指针强化11指针是一种数据类型1指针变量也是一种变量,占有内存空间,用来保存内存地址测试指针变量占有内存空间大小.2*p操作内存intmain(){inta=10;int*p=NULL;//指针指 ...

  7. Qt多语言实现和动态切换(国际化)

    Qt 界面实现多国语言的切换实例是本文要介绍的内容,一直认为Qt界面相对于还是很好实现的一种开发.多国语界面的实现,在MFC中是很别扭的.以前在作MFC时,实现多国语言的界面,只有把资源文件做成各个语 ...

  8. qt支持的html5,用 Qt 5 中实现多国语言支持

    Qt5 实现多国语言 引言 目的:自用/笔记 时间:2018-02-13 01:13 平台: Windows 7 项目:将英语界面添加德语和土耳其语翻译 步骤 使用默认语言写出整个工程,这里使用英语作 ...

  9. Qt+C++窗体界面中英文多语言切换

     程序示例精选 Qt+C++窗体界面中英文语言切换 如需安装运行环境或远程调试,见文章底部个人微信名片,由专业技术人员远程协助! 前言 这篇博客针对<<Qt+C++窗体界面中英文语言切换& ...

  10. Qt多语言切换-Qt语言家

    csdn文章地址 github网址 1. 前言 本文利用Qt语言大师工具,实现Qt程序的多国家语言切换,在github上放置的开源代码中同时放置了所使用的 Qt语言大师程序.CSDN上有众多的Qt语言 ...

最新文章

  1. 辩论届人机大战:IBM新AI完胜人类冠军!
  2. Re-Located Record in Grid
  3. C# AutoMapper的简单扩展
  4. linux网络编程之多路I/o转接服务器select
  5. android 广播唤醒应用,Android通过广播实现灭屏和唤醒
  6. 【转】Qt中的QString,QByteArray,Qchar, char*
  7. asp代码转成php代码,轻松将简单的asp代码转换为php代码
  8. 那些年我们一起用过的Hybrid App
  9. matlab——红绿灯颜色及数字识别(三)
  10. epub格式电子书剖析之二:OPF文件构成
  11. PHP变量说法不正常是,关于PHP变量的说法中正确的是(? ?)。
  12. 工业相机QE-量子转换效率
  13. Random库的8个函数
  14. Windows API学习(一)MapViewOfFile后一定要UnMapViewOfFile
  15. 美通企业日报 | 阿迪达斯和碧昂丝达成标志性合作;万豪国际公布亚太区2020年发展愿景...
  16. LY-100系列的纬编机纱长监控器
  17. 贾立平是中科学院计算机所博士,在思考中砥砺前行——记我校计算机与软件工程学院青年教师王晓明博士...
  18. ENC28J60学习笔记——第1部分
  19. R语言学习——plot函数
  20. 服务器电脑安装win10系统安装教程视频,台式电脑win10系统安装教程

热门文章

  1. 新西兰计算机设计专业,2020年出国新西兰学习计算机专业的要求是什么?
  2. DAPLink-Firmware
  3. Mac Android Studio连接MuMu模拟器
  4. matlab 频域响应,利用MATLAB软件分析系统的频率响应
  5. html的网页主题标记是什么,html标记是什么
  6. python登录代码_python自动登录126等邮箱的代码
  7. 从0到1哥斯拉项目反编译初步搭建
  8. 移植鸿蒙系统到STM32L476RG_NUCLEO开发板的一点小经验
  9. 都说IT行业有前景,请问凭什么?
  10. java毕业设计成品SpringBoot+VUE实现的电影院会员积分管理系统