Qt实现局域网聊天室:类似QQ抖动窗口功能的实现

来源:孤孤舟博客   此博客不错

http://guzhou.me/qt%e5%ae%9e%e7%8e%b0%e5%b1%80%e5%9f%9f%e7%bd%91%e8%81%8a%e5%a4%a9%e5%ae%a4%ef%bc%9a%e7%b1%bb%e4%bc%bcqq%e6%8a%96%e5%8a%a8%e7%aa%97%e5%8f%a3%e5%8a%9f%e8%83%bd%e7%9a%84%e5%ae%9e%e7%8e%b0/

 

 

在我们的子曰USay局域网聊天室中,与好友聊天时,可以点击输入框上面一排按钮中的抖动窗口按钮,即可给好友发送窗口抖动效果:

Qt实现局域网聊天室:类似QQ抖动窗口功能的实现_第1张图片

子曰USay:给好友发送抖动效果

其实,抖动效果实现起来非常简单,基本的思路就是安装一个定时器,每隔一段时间去移动窗口的位置,到了一定时间就关闭定时器。

我将实现窗口抖动的效果封装到了一个类中,该类的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef SHAKEWINDOW_H
#define SHAKEWINDOW_H
  
#include
#include
#include
  
//抖动的次数(移动窗口多少次)
enum {MaxLimitTimes = 20};
//抖动的幅度(每次抖动改变的窗口位置大小)
enum {MaxLimitSpace = 8};
//抖动定时器发生的时间间隔
enum {ShakeSpeed = 30};
  
class shakeWindow : public QObject
{
Q_OBJECT
  
public :
   shakeWindow(QDialog *dia,QObject *parent = 0);
   void startShake();
  
private :
   QDialog *dia;
   QTimer* m_timer;
   int m_nPosition;
   QPoint m_curPos;
  
private slots:
   void slot_timerOut();
};
  
#endif // SHAKEWINDOW_H

该类的实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "shakewindow.h"
  
shakeWindow::shakeWindow(QDialog *dia,QObject *parent):QObject(parent)
{
   this ->dia=dia;
   m_timer= new QTimer( this );
   QObject::connect(m_timer,SIGNAL(timeout()), this ,SLOT(slot_timerOut()));
   m_nPosition=MaxLimitTimes;
}
  
void shakeWindow::startShake()
{
   //如果正在抖动则返回
   if (m_nPosition < MaxLimitTimes)
     return ;
   m_nPosition=1;
   m_curPos= this ->dia->pos();
   m_timer->start(ShakeSpeed);
}
  
void shakeWindow::slot_timerOut()
{
   //还没有抖动完毕
   if (m_nPosition < MaxLimitTimes)
   {
     ++m_nPosition;
     switch (m_nPosition%4)
     {
     case 1:
     {
       QPoint tmpPos(m_curPos.x(),m_curPos.y()-MaxLimitSpace);
       this ->dia->move(tmpPos);
     }
     break ;
     case 2:
     {
       QPoint tmpPos(m_curPos.x()-MaxLimitSpace,m_curPos.y()-MaxLimitSpace);
       this ->dia->move(tmpPos);
     }
     break ;
     case 3:
     {
       QPoint tmpPos(m_curPos.x()-MaxLimitSpace,m_curPos.y());
       this ->dia->move(tmpPos);
     }
     break ;
     case 0:
     default :
        this ->dia->move(m_curPos);
        break ;
     }
   }
   //抖动完毕,关闭定时器
   else
   {
     m_timer->stop();
   }
}

这个抖动类的构造函数接受一个QDialog*类型的参数,在需要应用抖动效果的聊天对话框类chatRoom中,有一个shakeWindow类型的成员变量:

1
2
3
4
5
6
7
8
class chatRoom : public QDialog
{
  
......
  
private :
     shakeWindow shakeEffect;
}

然后在chatRoom类的构造函数中,构造这个成员变量:

1
2
3
4
5
6
7
chatRoom::chatRoom( int friendid,QWidget *parent) :
     QDialog(parent),
     ui( new Ui::chatRoom),
     shakeEffect( this ) //构造抖动对象
{
     ......
}

最后,在需要发生抖动的地方调用:

1
shakeEffect.startShake();

这样就可以实习窗口抖动了!

你可能感兴趣的:(Qt)