一个QT 3D转动控件
其实说到底就是不停的截图,做出的幻觉。联想起360拖动图片,也是合并图片做出的效果,可见的对GUI来说图片是一切,是最根本的解决一切问题的办法,编程仅是辅助实现手段而已,我要记住这一点。
.h文件
#ifndef WIDGET1_H
#define WIDGET1_H #include <QVariant>
#include <QWidget>
#include <QLabel>
#include <QStackedWidget>
class RotatingStackedWidget : public QStackedWidget
{
Q_OBJECT Q_PROPERTY( float rotateVal READ rotateVal WRITE setRotateVal);
public:
explicit RotatingStackedWidget(QWidget *parent = );
void paintEvent(QPaintEvent *);
void rotate(int); float rotateVal();
void setRotateVal(float); signals: private slots:
void valChanged(QVariant);
void animDone();
private:
float iRotateVal; bool isAnimating;
int nextIndex;
}; #endif // WIDGET1_H
.cpp文件:
#include "RotatingStackedWidget.h"
#include <QPixmap>
#include <QVBoxLayout>
#include <QPainter>
#include <QTransform>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>
#include <QDebug> RotatingStackedWidget::RotatingStackedWidget(QWidget *parent) :
QStackedWidget(parent)
{
iRotateVal=;
isAnimating=false;
}
void RotatingStackedWidget::paintEvent(QPaintEvent * event)
{
if(isAnimating)
{
if(iRotateVal > )
{
QPixmap pixmap(widget(nextIndex)->size());
widget(nextIndex)->render(&pixmap);
QPainter painter(this); QTransform transform;
transform.translate(width()/, );
transform.rotate(iRotateVal+,Qt::YAxis);
painter.setTransform(transform);
painter.drawPixmap(-*width()/,,pixmap);
}
else
{
QPixmap pixmap(currentWidget()->size());
currentWidget()->render(&pixmap);
QPainter painter(this); QTransform transform;
transform.translate(width()/, );
transform.rotate(iRotateVal,Qt::YAxis);
painter.setTransform(transform);
painter.drawPixmap(-*width()/,,pixmap);
}
}
else
{
QWidget::paintEvent(event);
}
} void RotatingStackedWidget::rotate(int index)
{
if(isAnimating)
return; nextIndex = index; int offsetx=frameRect().width();
int offsety=frameRect().height(); widget(index)->setGeometry ( , , offsetx, offsety ); QPropertyAnimation *animnow = new QPropertyAnimation(this,"rotateVal"); animnow->setDuration();
animnow->setEasingCurve(QEasingCurve::Linear);
animnow->setStartValue();
animnow->setEndValue();
connect(animnow,SIGNAL(valueChanged(QVariant)),this,SLOT(valChanged(QVariant)));
connect(animnow,SIGNAL(finished()),this,SLOT(animDone())); currentWidget()->hide(); isAnimating = true;
animnow->start();;
} float RotatingStackedWidget::rotateVal()
{
return iRotateVal;
}
void RotatingStackedWidget::setRotateVal(float fl)
{
iRotateVal = fl;
} void RotatingStackedWidget::valChanged(QVariant)
{
repaint();
} void RotatingStackedWidget::animDone()
{
iRotateVal=;
isAnimating=false;
widget(nextIndex)->show();
widget(nextIndex)->raise();;
setCurrentWidget(widget(nextIndex));
repaint(); }
参考:https://github.com/jun-zhang/Qt-Rotating-Widget
一个QT 3D转动控件的更多相关文章
- paper 139:qt超强绘图控件qwt - 安装及配置
qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...
- CAD控件:QT开发使用控件入门
1. 环境搭建: 3 1.1. 安装Qt 3 1.2. 安装Microsoft Windows SDK的调试包 6 2. QT中使用MxDraw控件 7 1.3. 引入控件 7 3. 打开DWG文件 ...
- Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)
对Qt5稍有熟悉的童鞋都知道信号.槽的自动连接机制.该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联.该机制的详细文章见 http: ...
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
- Qt列表等控件实现平滑滚动&deepin启动器存在的问题
Qt列表等控件实现平滑滚动 Qt自带的的列表控件是不能平滑滚动的,但如果滚动速度快的话很容易引起视线丢失,体验效果很差.本篇主要讲述如何在Qt中对列表控件加入平滑滚动.文中以QScrollArea控件 ...
- 分享一个漂亮的ProgressBar控件
codeprject上看到的一个漂亮的ProgressBar控件.是用vb.net开发的. C#直接在工具箱中引用即可. 地址:http://www.codeproject.com/Articles/ ...
- Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件
Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...
- android开发中一个activity如何调用另一个xml中的控件
有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...
- 如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?
如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?(How to efficiently let a `ParentFont = False` child con ...
随机推荐
- 鸟哥的Linux私房菜学习笔记(1)
2014/10/29 1.档案的权限管理分为三个部分: 拥有者.群组.其他 2.ls -al 命令可以看到档案的详细信息 3.档案的属性中由十个部分构成 第一个部分是档案类型 -代表档案.d代表文件夹 ...
- ADO简单封装(MFC)
简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...
- 转--DataTable 修改列名 删除列 调整列顺序
DataTable myDt =dt; //删除列 myDt.Columns.Remove("minArea"); myDt.Columns.Remove("maxAre ...
- 记录Access数据库更新操作大坑一个
对于更新Access数据库的操作,必须保持参数数组与sql语句中参数顺序一致,如下: public bool Update(MyModel model) { StringBuilder strSql ...
- 关于sql 资源竞争死锁现象
问题:System.Exception: 事务(进程 ID 321)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品.请重新运行该事务 死锁最深层的原因就是一个:资源竞争 表现 ...
- SQL Server 中WITH (NOLOCK)
with(nolock)的功能: 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取 ...
- Invalid segment BIN$xxx and dba_recyclebin was empty (回收站空,释放无效的BIN$xx空间)
近来有套库空间紧张,发现有很大BIN$开头的TABLE partition,index partition 类型的段,查询确认是2个月前删除的对象,手动清空过dba_recyclebin使用purge ...
- 关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
在jQuery中,有几种方式可以判断一个对象是否是数字,或者可否转换为数字. 首先,jQuery.isNaN()在最新版本中已经被移除了(1.7之后),取而代之的是 jQuery.isNumeric ...
- CocoaPods详解之----进阶篇
作者:wangzz原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709转载请注明出处如果觉得文章对你有所帮助,请通过留言或关注微信 ...
- 实习之vim基本学习
最近实习学到了写vim的基本用法,记录一下 批量注释 ctrl+v进入列模式,按“I”进入插入模式,按// #等在每行开头插入注释,esc 批量去除注释 ctrl + v 进入列模式,按“x”即可. ...