一个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 = 0);
        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=0;
    isAnimating=false;
}
void RotatingStackedWidget::paintEvent(QPaintEvent * event)
{
    if(isAnimating)
    {
        if(iRotateVal > 90)
        {
            QPixmap pixmap(widget(nextIndex)->size());
            widget(nextIndex)->render(&pixmap);
            QPainter painter(this);

            QTransform transform;
            transform.translate(width()/2, 0);
            transform.rotate(iRotateVal+180,Qt::YAxis);
            painter.setTransform(transform);
            painter.drawPixmap(-1*width()/2,0,pixmap);
        }
        else
        {
            QPixmap pixmap(currentWidget()->size());
            currentWidget()->render(&pixmap);
            QPainter painter(this);

            QTransform transform;
                 transform.translate(width()/2, 0);
                 transform.rotate(iRotateVal,Qt::YAxis);
                 painter.setTransform(transform);
            painter.drawPixmap(-1*width()/2,0,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 ( 0,  0, offsetx, offsety );

    QPropertyAnimation *animnow = new QPropertyAnimation(this,"rotateVal");

    animnow->setDuration(500);
    animnow->setEasingCurve(QEasingCurve::Linear);
    animnow->setStartValue(0);
    animnow->setEndValue(180);
    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=0;
    isAnimating=false;
    widget(nextIndex)->show();
    widget(nextIndex)->raise();;
    setCurrentWidget(widget(nextIndex));
    repaint();

}

参考:https://github.com/jun-zhang/Qt-Rotating-Widget

时间: 2024-10-17 21:20:50

一个QT 3D转动控件的相关文章

paper 139:qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发.但许多时候,qwt的安装配置难到了许多人,我曾经也在这里原地踏步很久,为了给大家开发方便,把我的安装经验分享给大家,避免

qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发.但许多时候,qwt的安装配置难到了许多人,我曾经也在这里原地踏步很久,为了给大家开发方便,把我的安装经验分享给大家,避免

cad动态的2D/3D图形控件VectorDraw Developer Framework (VDF)

VectorDraw Developer Framework (VDF)为您的应用程序增加动态的2D/3D图形.是一个可轻松创建爱你和管理及打印2D和3D图形的构件. 其对象可显示与大多数公共矢量格式和其他CAD对象兼容的方法和属性. 支持10多种矢量格式和多种离散格式.VectorDraw Developer Framework (VDF) 是完全基于对象的和支持 .NET 2的. 此构件是用.NET 2005 C# 代码写成的. 同时还提供了一个ActiveX组件. 此ActiveX组件为旧

Qt Creator 窗体控件自适应窗口大小布局(转)

常见的软件窗口大小改变(最大化.手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的.网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少. Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout.QVBoxLayout.

QT内label控件通过opencv显示图像

1.对pro进行配置,使其能够理解opencv. INCLUDEPATH+=d:\opencv249\include\opencv d:\opencv249\include\opencv2 d:\opencv249\include LIBS+=d:\opencv249\lib\libopencv_calib3d249.dll.a d:\opencv249\lib\libopencv_contrib249.dll.a d:\opencv249\lib\libopencv_core249.dll.a

CAD控件:QT开发使用控件入门

1. 环境搭建: 3 1.1. 安装Qt 3 1.2. 安装Microsoft Windows SDK的调试包 6 2. QT中使用MxDraw控件 7 1.3. 引入控件 7 3. 打开DWG文件 11 1.4. 增加打开文件按钮 11 1.5. 在VS中使用QT 13 环境搭建: 1.1. 安装Qt 官网地址:http://qt-project.org/,进入官网,点击  [Download]  到下载页面 如下: 再点击[Download],不使用它的在线安装,太慢,再点击[View Al

Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 一.概述 最近在研究QTableView支持多级表头的事情,百度了下网上资料还是挺多的.实现的方式总的来说有2种,效果都还不错,最主要是搞懂其中的原理,做到以不变应万变. 实现多级表头的方式有以下两种方案 行表头和列表头都是用一个表格去模拟 重写QHeadView 以上两种方式都可以实现多级表头,各

Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件

Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的功能,读取Excel的数据并导入到Dataset或数据库中.读取Excel表格数据的代码如下: 首先要引入命名空间:using Aspose.Cells; Workbook workbook = new Workbook(); workbook.Open("C:\\test.xlsx");

如何获取上一个页面中checkbox控件选中的值

php开发中,<php开发中.<php开发中.如何获取上一个页面中checkbox控件选中的值呢?并输出出来,以下是代码示例: <? $music=$_POST['music']; //取得所选中的checkbox个数 $coun=count$music; ifis_arrai$music{ echo'您选择的 : '; foreach$musicas$kei=>$var echo'  ['.$var.']'; echo$key; } ?> *****************