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

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

效果图

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

方案要点

    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. }

写在最后

      样例代码有些粗糙,欢迎改进,欢迎交流!
      期待各种建议、意见、和创意ideas!
http://blog.csdn.net/yiyaaixuexi/article/details/7209982