在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