您的位置:首页 > Web前端 > CSS

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

2015-11-25 08:38 573 查看
Qt 鼠标样式特效探索样例(一)

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

效果图



方案要点

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

实现代码

#ifndef WIDGET_H

#define WIDGET_H

#include <QtGui/QWidget>

#include <QTimer>

#include <QList>

#include <QPoint>

class Widget : public QWidget

{

Q_OBJECT

public:

Widget(QWidget *parent = 0);

~Widget();

private:

QWidget *w1,*w2,*w3,*w4;

QTimer *timer;

QList<QPoint> pos_list_w2;

QList<QPoint> pos_list_w3;

QList<QPoint> pos_list_w4;

int count;

void setMyStyle(QWidget *wid, int w, int h);

protected:

void mouseMoveEvent(QMouseEvent *event);

private slots:

void updatePos();

};

#endif // WIDGET_H

#include "widget.h"

#include <QPalette>

#include <QDebug>

#include <QMouseEvent>

Widget::Widget(QWidget *parent)

: QWidget(parent)

{

QPalette phome = this->palette();

phome.setBrush(this->backgroundRole(), QBrush(QPixmap(":/images/bg.jpg")));

this->setPalette(phome);

w1 = new QWidget(this);

w2 = new QWidget(this);

w3 = new QWidget(this);

w4 = new QWidget(this);

setMyStyle(w1,34,34);

setMyStyle(w2,26,26);

setMyStyle(w3,18,18);

setMyStyle(w4,9,9);

timer = new QTimer(this);

connect(timer,SIGNAL(timeout()),this,SLOT(updatePos()));

timer->start(100);

this->setMouseTracking(true);

count = 0;

}

Widget::~Widget()

{

}

void Widget::setMyStyle(QWidget *wid, int w, int h)

{

wid->setWindowFlags(Qt::FramelessWindowHint);

wid->resize(w,h);

wid->setStyleSheet("border-image: url(:/images/cursor.png);");

}

void Widget::mouseMoveEvent(QMouseEvent *event)

{

w1->move(event->x(),event->y());

if(!count)

pos_list_w2 << event->pos();

count > 7 ? (count = 0): count++;

}

void Widget::updatePos()

{

if(!pos_list_w4.isEmpty())

{

this->w4->move(pos_list_w4.takeFirst());

}

if(!pos_list_w3.isEmpty())

{

pos_list_w4 << pos_list_w3.first();

this->w3->move(pos_list_w3.takeFirst());

}

if(!pos_list_w2.isEmpty())

{

pos_list_w3 << pos_list_w2.first();

this->w2->move(pos_list_w2.takeFirst());

}

}

写在最后

样例代码有些粗糙,欢迎改进,欢迎交流!
期待各种建议、意见、和创意ideas!
http://blog.csdn.net/yiyaaixuexi/article/details/7209982
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: