其实说到底就是不停的截图,做出的幻觉。联想起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