1. 程式人生 > >Qt之滑鼠樣式特效探索樣例

Qt之滑鼠樣式特效探索樣例

心血來潮,突然想在Qt裡玩一把滑鼠樣式,想到在瀏覽網頁時,經常看到漂亮的滑鼠動畫,於是今天摸索著亂寫個粗糙的demo,來滿足自己的好奇心。

效果圖    


方案要點

    1.不管用什麼控制元件,顯示動畫需要的4張星星圖,大小依次遞減。     2.記錄滑鼠移動座標,分時、分段讓星星控制元件響應move移動到對應軌跡。     3.移動座標資料量大,不必每一個值都使其成為星星控制元件的移動軌跡。     4.星星控制元件起始座標注意劈開滑鼠焦點座標,否則使用者無法點選窗體控制元件,而只能瘋狂的點到星星控制元件了。

實現程式碼

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


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