在qq等聊天软件中都有发送窗口抖动功能,现在在qt下实现该功能。
用到的类主要有 QTimer 和 QPoint
QTimer 类的作用是启用定时器,在不同时刻使窗口处于不同位置,从而得到的效果就是窗口的抖动。 QPoint 类的作用是定位窗口的位置(坐标)。
源代码如下:
//chardialog.h
#ifndef CHATDIALOG_H
#define CHATDIALOG_H
#include <QDialog>
namespace Ui {
class ChatDialog;
}
class ChatDialog : public QDialog
{
Q_OBJECT
public:
explicit ChatDialog(PersonLoginInfo *pb,QWidget *parent=0);
~ChatDialog();
private:
Ui::ChatDialog *ui;
private:
QTimer* M_Timer;
int Counter;
QPoint curPos;
enum{MaxLimitTimes=500};//抖动次数
enum{MaxLimitSpace=20};//抖动幅度
enum{ShakeSpeed=1000}; //抖动速度
private slots:
void S_TimeOut();
void slotShakeWindow();
};
#endif // CHATDIALOG_H
//chatdialog.cpp
#include "chatdialog.h"
#include "ui_chatdialog.h"
ChatDialog::ChatDialog(PersonLoginInfo *pb,QWidget *parent) :
QDialog(parent),
ui(new Ui::ChatDialog)
{
ui->setupUi(this);
M_Timer=new QTimer(this);
connect(M_Timer,SIGNAL(timeout()),this,SLOT(S_TimeOut()));
connect(ui->ShakeWindow,SIGNAL(clicked()),this,SLOT(slotShakeWindow()));
Counter=MaxLimitTimes;
}
void ChatDialog::S_TimeOut()
{
if(Counter<MaxLimitTimes)//没有抖动结束
{
++Counter;
switch(Counter%4)
{
case 1:
{
QPoint TmpPos(curPos.x(),curPos.y()-MaxLimitSpace);
this->move(TmpPos);
}
break;
case 2:
{
QPoint TmpPos(curPos.x()-MaxLimitSpace,curPos.y()-MaxLimitSpace);
this->move(TmpPos);
}
break;
case 3:
{
QPoint TmpPos(curPos.x()-MaxLimitSpace,curPos.y());
this->move(TmpPos);
}
break;
case 0:
default:
this->move(curPos);
break;
}
}
else
{
M_Timer->stop();
}
}
void ChatDialog::slotShakeWindow()
{
Counter=0;
curPos=this->pos();
M_Timer->start(ShakeSpeed);
}
《寄语:吾生也有涯,而知也无涯》
2014-07-24 03:21:53