Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数

Qt 鼠标样式特效探索样例(一)
 
    心血来潮,突然想在Qt里玩一把鼠标样式,想到在浏览网页时,经常看到漂亮的鼠标动画,于是今天摸索着乱写个粗糙的demo,来满足自己的好奇心。

效果图    

方案要点

    1.不管用什么控件,显示动画需要的4张星星图,大小依次递减。
    2.记录鼠标移动坐标,分时、分段让星星控件响应move移动到对应轨迹。
    3.移动坐标数据量大,不必每一个值都使其成为星星控件的移动轨迹。
    4.星星控件起始坐标注意劈开鼠标焦点坐标,否则用户无法点击窗体控件,而只能疯狂的点到星星控件了。
 

实现代码

 
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QtGui/QWidget>  
  5. #include <QTimer>  
  6. #include <QList>  
  7. #include <QPoint>  
  8.   
  9. class Widget : public QWidget  
  10. {  
  11.     Q_OBJECT  
  12.   
  13. public:  
  14.     Widget(QWidget *parent = 0);  
  15.     ~Widget();  
  16.   
  17. private:  
  18.     QWidget *w1,*w2,*w3,*w4;  
  19.     QTimer *timer;  
  20.     QList<QPoint> pos_list_w2;  
  21.     QList<QPoint> pos_list_w3;  
  22.     QList<QPoint> pos_list_w4;  
  23.     int count;  
  24.     void setMyStyle(QWidget *wid, int w, int h);  
  25.   
  26. protected:  
  27.     void mouseMoveEvent(QMouseEvent *event);  
  28.   
  29. private slots:  
  30.     void updatePos();  
  31. };  
  32.   
  33. #endif // WIDGET_H  


 
  1. #include "widget.h"  
  2. #include <QPalette>  
  3. #include <QDebug>  
  4. #include <QMouseEvent>  
  5.   
  6. Widget::Widget(QWidget *parent)  
  7.     : QWidget(parent)  
  8. {  
  9.     QPalette phome = this->palette();  
  10.     phome.setBrush(this->backgroundRole(), QBrush(QPixmap(":/images/bg.jpg")));  
  11.     this->setPalette(phome);  
  12.   
  13.     w1 = new QWidget(this);  
  14.     w2 = new QWidget(this);  
  15.     w3 = new QWidget(this);  
  16.     w4 = new QWidget(this);  
  17.   
  18.     setMyStyle(w1,34,34);  
  19.     setMyStyle(w2,26,26);  
  20.     setMyStyle(w3,18,18);  
  21.     setMyStyle(w4,9,9);  
  22.   
  23.     timer = new QTimer(this);  
  24.     connect(timer,SIGNAL(timeout()),this,SLOT(updatePos()));  
  25.     timer->start(100);  
  26.   
  27.     this->setMouseTracking(true);  
  28.   
  29.     count = 0;  
  30. }  
  31.   
  32. Widget::~Widget()  
  33. {  
  34.   
  35. }  
  36.   
  37. void Widget::setMyStyle(QWidget *wid, int w, int h)  
  38. {  
  39.     wid->setWindowFlags(Qt::FramelessWindowHint);  
  40.     wid->resize(w,h);  
  41.     wid->setStyleSheet("border-image: url(:/images/cursor.png);");  
  42. }  
  43.   
  44. void Widget::mouseMoveEvent(QMouseEvent *event)  
  45. {  
  46.   
  47.      w1->move(event->x(),event->y());  
  48.      if(!count)  
  49.          pos_list_w2 << event->pos();  
  50.          count > 7 ? (count = 0): count++;  
  51.        
  52. }  
  53.   
  54. void Widget::updatePos()  
  55. {  
  56.     if(!pos_list_w4.isEmpty())  
  57.     {  
  58.         this->w4->move(pos_list_w4.takeFirst());  
  59.     }  
  60.     if(!pos_list_w3.isEmpty())  
  61.     {  
  62.         pos_list_w4 << pos_list_w3.first();  
  63.         this->w3->move(pos_list_w3.takeFirst());  
  64.     }  
  65.   
  66.     if(!pos_list_w2.isEmpty())  
  67.     {  
  68.         pos_list_w3 << pos_list_w2.first();  
  69.         this->w2->move(pos_list_w2.takeFirst());  
  70.     }  
  71. }  

写在最后

      样例代码有些粗糙,欢迎改进,欢迎交流!
      期待各种建议、意见、和创意ideas!
 
http://blog.csdn.net/yiyaaixuexi/article/details/7209982
原文地址:https://www.cnblogs.com/findumars/p/4993581.html