• 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
  • 相关阅读:
    数据库表结构查询SQL
    Java实现数据库备份并利用ant导入SQL脚本
    生死看淡,不服就干。SQL常见的一些优化。
    mybatis + PageHelper 实现分页
    自定义数据库连接池实现方式 MySQL
    Docker 镜像基础(三)
    Docker 镜像管理及基础命令(二)
    Docker 介绍和安装(一)
    Docker 镜像管理及基础命令(二)
    Tomcat-8 安装和配置
  • 原文地址:https://www.cnblogs.com/findumars/p/4993581.html
Copyright © 2020-2023  润新知