zoukankan      html  css  js  c++  java
  • 一个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

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/findumars/p/4711391.html
Copyright © 2011-2022 走看看