Qt5教程之实现窗口靠边后隐藏自己

0 755
索鸟 2021-03-19
需要:0索币

Qt事件介绍

事件(event)是有系统或者Qt本身在不同的时刻发出的,当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。


Qt常见事件

键盘事件(QKeyEvent ):按键按下和松开.

鼠标事件(MouseEvent): 鼠标移动,鼠标按键的按下和松开.

拖放事件(QDropEvent): 用鼠标进行拖放.

滚轮事件(QWheelEvent): 鼠标滚轮滚动.

绘屏事件(QPaintEvent): 重绘屏幕的某些部分.

定时事件(QTimerEvent): 定时器到时.

焦点事件(QFocusEvent): 键盘焦点移动.

进入和离开事件(enterEvent(), leaveEvent): 鼠标移入widget之内,或是移出.

移动事件(QMoveEvent): widget的位置改变.

大小改变事件(QResizeEvent): widget的大小改变.

显示和隐藏事件(QShowEvent, QHideEvent): widget显示和隐藏.


窗口靠边所需应用事件

靠猜测相信大家应该也能猜出需要应用QT哪些事件来实现我们需要的效果

void leaveEvent(QEvent *event);

void enterEvent(QEvent *event);

void mouseReleaseEvent(QMouseEvent*event);

void mouseMoveEvent(QMouseEvent*event);

void mousePressEvent(QMouseEvent*event);

以上QT里的5种事件就是今天我们需要应用的,是不是感觉有些复杂呢?没关系等我来给大家理一理,你就会恍然大悟,其实也没那么难。It‘s So Easy!我先给大家上两张效果图,让大家更想也能这样实现一把。


窗口靠边效果图

 /storage/upload/20210319/e6d7803fd508c364b1c8dc1a18799496.gif

码农之路

看了上面的效果图之后,亲们~是不是也想感觉看见我的代码也去实现一番吶?好的,我们这就开启代码之路………..


//我们先来看看窗口的进入事件(enterEvent)

void EdgeToHide::enterEvent(QEvent *event)

{

    switch (m_eEdgeStatus)

    {

    case EG_TOP:

        setGeometry(pos().x(), -SHOW_EDGE_WIDTH, width(), height());

        break;

    case EG_LEFT:

        setGeometry(-SHOW_EDGE_WIDTH, y(), width(), height());

        break;

    case EG_RIGHT:

        setGeometry(QApplication::desktop()->width() - width() + SHOW_EDGE_WIDTH, y(), width(), height());

        break;

    }

    return QWidget::enterEvent(event);

}

//窗口的离开事件(leaveEvent)

void EdgeToHide::leaveEvent(QEvent *event)

{

    switch (m_eEdgeStatus)

    {

    case EG_TOP:

        setGeometry(pos().x(), -height() + SHOW_EDGE_WIDTH, width(), height());

        break;

    case EG_LEFT:

        setGeometry(-width() + SHOW_EDGE_WIDTH, pos().y(), width(), height());

        break;

    case EG_RIGHT:

        setGeometry(QApplication::desktop()->width() - SHOW_EDGE_WIDTH, pos().y(), width(), height());

        break;

    }

    return QWidget::leaveEvent(event);

}

//鼠标释放弹起事件(mouseReleaseEvent)

void EdgeToHide::mouseReleaseEvent(QMouseEvent*event)

{

    if (y() <= 0)

    {

        m_eEdgeStatus = EG_TOP;

    }

    else if (QApplication::desktop()->width() <= (this->x() + width()))

    {

        m_eEdgeStatus = EG_RIGHT;

    }

    else if (this->x() <= 0)

    {

        m_eEdgeStatus = EG_LEFT;

    }

    else

    {

        m_eEdgeStatus = EG_NORMAL;

    }

    QWidget::mouseReleaseEvent(event);

}


我们理一理哈,其实很简单,我首先需要移动窗口到边缘上,释放鼠标记录当前状态,看窗口在左边缘,右边缘,上边缘,还是正常的显示位置。OK,这是第一步。

第二步,检测到上一步状态后,我鼠标离开了界面窗口,然后进入离开事件机制中。检测状态,是否需要隐藏。

第三步,鼠标进来啦~~~快快现形吧!

是不是很简单啦,我们边缘隐藏效果就完成啦~眼光利索的朋友可能发现了,代码中不是还有两个事件没用上,是的。在这里因为我的窗口是不支持拖动的啦~所以需要另外的两个

mouseMoveEvent(QMouseEvent*event);

mousePressEvent(QMouseEvent*event);

这两个事件来支持我的窗口移动。至于怎么移动窗口嘛,等下会揭晓了哦O(∩_∩)O。


结尾

只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!

————————————————

原文链接:https://blog.csdn.net/ly305750665/article/details/53525706

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0