QT实现QQ界面
2016-07-19 16:52
501 查看
暑假在家闲的无事,于是花了两天时间用QT做了一个模仿QQ的界面,其实有很多中实现方法,并不难,主要时看你有没有那种决心研究下来的决心。
好了废话不多说,先看下我的效果,首先时登录界面:
然后点击登录按钮后有一个图像从左往中间滑动的的动画,为了像个正在登录的样子,给这个动画animation设置了一个监听事件,当动画完成后显示一秒下面这个界面后出现QQ好友列表界面:
以下是QQ的主界面:
然后是系统托盘图标
怎么样?如果不仔细看是不是会被这个当做真正的QQ,所以我说叫高仿咯!
那么接下来我说一下其中几个比较有意思的地方:
一.窗口靠边停放时,鼠标离开窗口会最小化
QQ在靠着显示屏的窗口停靠时如果鼠标离开窗口的范围,那么窗口就会滑动到显示屏里面,然后最小化,这个怎么实现呢?
很简单,重载void enterEvent(QEvent *e)函数,这样当鼠标的箭头离开时就可以执行相应的动画:代码如下:
void Dialog::leaveEvent(QEvent *e){
QRect *rect = new QRect(this->pos().x(),this->pos().y(),this->width(),this->height());
QCursor cursor;
startX = this->pos().x(); //获取窗口当前的位置x坐标
startY = this->pos().y(); //
4000
获取窗口当前的位置y坐标
animation->setStartValue(QPoint(startX,startY));
animation->setEndValue(QPoint(g_nActScreenX,this->pos().y()));
animation->setDuration(200);
if(!(cursor.pos().x() > rect->topLeft().x() &&cursor.pos().y() > rect->topLeft().y() &&cursor.pos().y() < rect->bottomRight().y()) &&this->pos().x() + this->width()+ 30 > g_nActScreenX ) //g_nActScreenX 为整个显示屏的宽度
animation->start();
qDebug()<< "outOfWindow";
}
细心的小伙班可能会注意到我是先获取了窗口所在的矩形区域,然后判断鼠标是否在这个区域内,为什么要这么多此一举呢?这是当我点击一个按钮如果弹出菜单,就像下面这样的时候,这个时候可能是因为这个QMenu获取了鼠标的焦点,他会认为鼠标此时离开了窗口界面,会执行leaveEvent()即让窗口最小化,而事实上我此时只是点击了窗口上的按钮,并没有离开窗口:
二.QQ好友列表实现
之前看到好多地方说是QQ好友列表界面,但是他们都是用的QToolBox这个控件,那么实际用起来完全不是QQ列表那么回事。
QT是没有这样的控件的,因此如果想要用这种控件的话只有自定义控件。那么如何定义呢?我个人觉得方法很多,例如你可以用QT creator自定义这样的控件。
那么我个人采用的是QVBoxLayout(垂直布局)和widget.的setVisible(bool)函数实现的,一两句话说不清楚,反正时控件里面套控件,控件再套控件,这个得益于之前网上看到别人的一篇博客:http://blog.csdn.net/shuideyidi/article/details/30619167
整个项目难点应该就是以上两点,还是那句话,实现方法很多,我这个实现方法只是其中之一,期待能有更多的方法,欢迎大家和我交流。
整个工程我已经上传到csdn上了,欢迎大家下载:http://download.csdn.net/detail/qq_31281189/9580363
大神勿喷。。。。。。。
好了废话不多说,先看下我的效果,首先时登录界面:
然后点击登录按钮后有一个图像从左往中间滑动的的动画,为了像个正在登录的样子,给这个动画animation设置了一个监听事件,当动画完成后显示一秒下面这个界面后出现QQ好友列表界面:
以下是QQ的主界面:
然后是系统托盘图标
怎么样?如果不仔细看是不是会被这个当做真正的QQ,所以我说叫高仿咯!
那么接下来我说一下其中几个比较有意思的地方:
一.窗口靠边停放时,鼠标离开窗口会最小化
QQ在靠着显示屏的窗口停靠时如果鼠标离开窗口的范围,那么窗口就会滑动到显示屏里面,然后最小化,这个怎么实现呢?
很简单,重载void enterEvent(QEvent *e)函数,这样当鼠标的箭头离开时就可以执行相应的动画:代码如下:
void Dialog::leaveEvent(QEvent *e){
QRect *rect = new QRect(this->pos().x(),this->pos().y(),this->width(),this->height());
QCursor cursor;
startX = this->pos().x(); //获取窗口当前的位置x坐标
startY = this->pos().y(); //
4000
获取窗口当前的位置y坐标
animation->setStartValue(QPoint(startX,startY));
animation->setEndValue(QPoint(g_nActScreenX,this->pos().y()));
animation->setDuration(200);
if(!(cursor.pos().x() > rect->topLeft().x() &&cursor.pos().y() > rect->topLeft().y() &&cursor.pos().y() < rect->bottomRight().y()) &&this->pos().x() + this->width()+ 30 > g_nActScreenX ) //g_nActScreenX 为整个显示屏的宽度
animation->start();
qDebug()<< "outOfWindow";
}
细心的小伙班可能会注意到我是先获取了窗口所在的矩形区域,然后判断鼠标是否在这个区域内,为什么要这么多此一举呢?这是当我点击一个按钮如果弹出菜单,就像下面这样的时候,这个时候可能是因为这个QMenu获取了鼠标的焦点,他会认为鼠标此时离开了窗口界面,会执行leaveEvent()即让窗口最小化,而事实上我此时只是点击了窗口上的按钮,并没有离开窗口:
二.QQ好友列表实现
之前看到好多地方说是QQ好友列表界面,但是他们都是用的QToolBox这个控件,那么实际用起来完全不是QQ列表那么回事。
QT是没有这样的控件的,因此如果想要用这种控件的话只有自定义控件。那么如何定义呢?我个人觉得方法很多,例如你可以用QT creator自定义这样的控件。
那么我个人采用的是QVBoxLayout(垂直布局)和widget.的setVisible(bool)函数实现的,一两句话说不清楚,反正时控件里面套控件,控件再套控件,这个得益于之前网上看到别人的一篇博客:http://blog.csdn.net/shuideyidi/article/details/30619167
整个项目难点应该就是以上两点,还是那句话,实现方法很多,我这个实现方法只是其中之一,期待能有更多的方法,欢迎大家和我交流。
整个工程我已经上传到csdn上了,欢迎大家下载:http://download.csdn.net/detail/qq_31281189/9580363
大神勿喷。。。。。。。
相关文章推荐
- QT学习之路————使用QT自带的QSqlDatabase类简单操作sqlite数据库
- 一次失败的QThread多线程加载Webpage.load()页面的尝试
- Qt之绘制闪烁文本
- Qt之绘制闪烁文本
- Qt之绘制闪烁文本
- QT TAB键跳转
- Qt之QCustomPlot(图形库)
- Qt之QCustomPlot(图形库)
- Qt之QCustomPlot(图形库)
- Qt-5.5.1 设置界面字体为微软雅黑
- 关于Qt5.70你必须知道的那点事
- Qt 并行框架参考资料和视频
- QT4保存调试日志
- Qt基于FFmpeg播放本地 H.264(H264)文件
- QT Creator Log List
- qt5集成libcurl实现tftp和ftp的方法之二:实现tftp文件上传和下载
- Windows环境下Qt与MySQL编译环境配置
- VS2013+QT5.3 中文乱码问题 解决方案
- Qt学习笔记---信号与槽
- QT的信号与槽机制介绍