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

效果图    

Qt之鼠标样式特效探索样例

方案要点

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

实现代码


[cpp] view plain copy
  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  


[cpp] view plain copy
  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. }  

原文链接:http://blog.csdn.net/yiyaaixuexi/article/details/7209982

相关文章:

  • 2021-12-16
  • 2021-12-12
  • 2021-06-17
  • 2021-10-29
  • 2021-12-22
  • 2021-09-19
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-04
  • 2022-01-09
  • 2021-12-16
  • 2021-11-06
相关资源
相似解决方案