qt实现的窗口吸附屏幕边缘,动画隐藏显示的效果,类似于qq主窗口 吸附 隐藏的效果

Python Qt窗口实现类似QQ界面的屏幕边缘隐藏功能 直接上代码,copy过去就能用 思路: 后台300ms检测一次窗口的位置 窗口x坐标移到屏幕上界限附近,且鼠标移出窗口时。将窗口移出屏幕 反过来检测窗口的位置和鼠标的位置,再将窗口移回即可。 同时获取屏幕长宽以此来将移出左右两侧的窗口拉回 #!/bin/env python # -*- coding:utf-8 -*- ''' Class: my_hide_or_show.py Programmer: tangzhiying Date: 2 阅读详情

对于这个效果的实现,其实方法应该还是很多的,这里的实现简单的原理只是一种,可能还不是很好,做个借鉴吧。

大概就是需要两个的计时器,第一个是用来判断窗口是不是在边缘附近,我们要把它吸附上去;第二个是用来判断是不是满足了隐藏,或者显示的效果的条件。然后利用动画来进行这些显示的过度,在过程中先中断一下事件处理,让窗口动画先走玩(很短,而且被事件中断的话,用户交互也不太友好)。其实原理就很简单的,还是上一下简单的代码了。

timer_edgeMove = new QTimer(this);
timer_edgeMove->setSingleShot(false);
timer_edgeMove->setInterval(EdgeMoveTime);//自己设定一个间断的时间
timer_edgeHide = new QTimer(this);
timer_edgeHide->setSingleShot(false);
timer_edgeHide->setInterval(EdgeHideTime);//自己设定一个间断的时间
connect(timer_edgeMove,&QTimer::timeout,this,&MainWindow::updateEdgeMove);//这里是定时器触发的两个函数,做判断以及实现,具体实现在后面
connect(timer_edgeHide,&QTimer::timeout,this,&MainWindow::updateEdgeHide);
timer_edgeMove->start();
timer_edgeHide->start();
mousePress = false;//鼠标的按键状态,判断定时器开关
winHide = winHideType::none;//当前需要的隐藏的状态
blockAll = false;//主要是根据动画的状态来设置,来判断是否在动画过程中忽略一下鼠标的事件等。
edgeMoveAnimation = new QPropertyAnimation(this,"pos",this);//参数分别为目标,属性,和父元素。
//动画完成后的回复响应
connect(edgeMoveAnimation,&QPropertyAnimation::finished,[=](){
blockAll = false;
timer_edgeMove->start();
timer_edgeHide->start();
});
初始化就是这样了,然后就是吸附的计时器触发的函数:

//处理吸附的计时
void MainWindow::updateEdgeMove()
{
    int targetx,targety;
    //这里要判断一下是不是鼠标按着,或者是已经隐藏,都不需要做处理。
    if(mousePress == true || winHide!=winHideType::none)
        return;
    int enableMove = 0;
//    qDebug()<<this->x()<<this->y();
    //y方向的判断,这里<span style="font-family: Arial, Helvetica, sans-serif;">EdgeAttachMargin是自定义的一个你想要让他吸附的距离,就是靠边缘多近要吸附上去,enableMove是用来最后判断是否需要动画的一个标志位</span>
    if(this->y()<EdgeAttachMargin&&this->y()!=0){
        targety = 0;
        enableMove = 1;
    }
    else
        targety = this->y();
    //x方向和y差别不大,就是需要多判断一下左右的两种情况,y只需要上方一种情况。
    if(this->x()<EdgeAttachMargin&&this->x()!=0){
        enableMove = 1;
        targetx = 0;
    }
    else{
        int rightx = this->x()+this->width();
        if(rightx> (QApplication::desktop()->width()-EdgeAttachMargin)&&rightx!=QApplication::desktop()->width()){
            targetx = QApplication::desktop()->width()-this->width();
            enableMove = 1;
        }
        else
            targetx = this->x();
    }
    if(1==enableMove){
//        qDebug()<<"move action...";
        winAnimation(QPoint(targetx,targety),QPoint(this->x(),this->y()));//这里是调用吸附过去的动画,一个初始值,一个目标值,函数具体在后面
    }
}
注释都大概说了,下面就继续隐藏的计时触发的事件,这个代码可能多一点,其实也是一样的多些判断而已:

//处理隐藏的计时
void MainWindow::updateEdgeHide()
{
    QPoint mouP=QCursor::pos();
    QPoint target;
    QPoint oldpos;
    bool enableHS =false;//也是用做判断是否需要进行动画的标志位。
    if(winHide == winHideType::none&& this->isVisible() == true)
    {//还未隐藏
<span style="white-space:pre">	</span>//这里判断一下鼠标的位置是否不在窗体上,不在才需要进行隐藏的操作
        if(mouP.x()<this->x() || (mouP.x()-this->x())>this->width() || mouP.y()<this->y() || (mouP.y()-this->y())>this->height())
        {
            oldpos.setX(this->x());
            oldpos.setY(this->y());
<pre name="code" class="cpp">            //在上方的情况(如果在左右方,但是还是优先往上缩)
if(0==this->y()) { //缩起 target.setX(oldpos.x()); target.setY(EdgeShowWidth-this->height()); enableHS = true; winHide =winHideType::y; }else {

<span style="white-space:pre">		</span>//在左方的情况
                if(0==this->x())
                {
                    target.setX(EdgeShowWidth-this->width());
                    target.setY(oldpos.y());
                    enableHS = true;
                    winHide =winHideType::xleft;
                }else
<span style="white-space:pre">		</span>    //在右方的情况
                    if(QApplication::desktop()->width()==(oldpos.x()+this->width()))
                    {
                        target.setX(QApplication::desktop()->width()-EdgeShowWidth);
                        target.setY(oldpos.y());
                        enableHS = true;
                        winHide =winHideType::xright;
                    }
            }
        }
    }else
    {//已经隐藏,判断是否鼠标进入了屏幕边缘的窗体的区域,是就需要触发显示窗口的动作
        if(! (mouP.x()<this->x() || (mouP.x()-this->x())>this->width() || mouP.y()<this->y() || (mouP.y()-this->y())>this->height()) )
        {
            oldpos.setX(this->x());
            oldpos.setY(this->y());
<span style="white-space:pre">	</span>    //分别也是对应于上,左,右这三个方向。
            if(winHide == winHideType::y)
            {
                target.setX(oldpos.x());
                target.setY(0);
                enableHS = true;
                winHide =winHideType::none;
            }else
            {
                if(winHide == winHideType::xleft)
                {
                    target.setX(0);
                    target.setY(oldpos.y());
                    enableHS = true;
                    winHide =winHideType::none;
                }else
                    if(winHide == winHideType::xright)
                    {
                        target.setX(QApplication::desktop()->width() - this->width());
                        target.setY(oldpos.y());
                        enableHS = true;
                        winHide =winHideType::none;
                    }
            }
        }
    }
    //如果需要显示,就调用动画,同样是传原始和目标的值作为参数。
    if(true==enableHS){
//        qDebug()<<"hide show action..."<<winHide;
        winAnimation(target,oldpos);
    }
}
然后是调用的动画:

//隐藏动画
void MainWindow::winAnimation(QPoint target,QPoint oldpos)
{
    edgeMoveAnimation->setDuration(300);
    edgeMoveAnimation->setStartValue(QPoint(oldpos.x(),oldpos.y()));
    edgeMoveAnimation->setEndValue(QPoint(target.x(), target.y()));
    edgeMoveAnimation->setEasingCurve(QEasingCurve::OutCubic);
    edgeMoveAnimation->start();
    timer_edgeMove->stop();
    timer_edgeHide->stop();
    blockAll = true;

}
然后最后就是当动画在进行的时候你可以根据blockAll的状态来忽略一些鼠标的事件:

//处理鼠标的进入时间,用于自动隐藏
bool MainWindow::eventFilter(QObject* obj, QEvent* event)
{
    if(obj== this)
    {
        //播放动画时阻塞操作
        if(blockAll == true && event->type() == QEvent::MouseButtonPress)
            return true;
        if(event->type() == QEvent::MouseButtonPress)
        {
            mousePress = true;
            timer_edgeMove->stop();
//            qDebug()<<"MouseButtonPress"<<mousePress;
        }
        else if((event->type() == QEvent::MouseButtonRelease) && mousePress)
        {
            timer_edgeMove->start();
            mousePress= false;
//            qDebug()<<"MouseButtonRelease"<<mousePress;
        }
    }
    return QObject::eventFilter(obj, event);
}

就大致是这样的了,其实想法还是很简单的。

最后有一个就是,如果你想通过点击托盘,然后让窗口动画显示出来,那就在托盘双击的事件添加一个调用函数咯:

//点击还原时的show
void MainWindow::updateShowNormal()
{
    if(winHide != winHideType::none)
    {
        QPoint target;
        QPoint oldpos;
        bool enableHS;
        oldpos.setX(this->x());
        oldpos.setY(this->y());
        if(winHide == winHideType::y)
        {
            target.setX(oldpos.x());
            target.setY(0);
            enableHS = true;
            winHide =winHideType::none;
        }else
        {
            if(winHide == winHideType::xleft)
            {
                target.setX(0);
                target.setY(oldpos.y());
                enableHS = true;
                winHide =winHideType::none;
            }else
                if(winHide == winHideType::xright)
                {
                    target.setX(QApplication::desktop()->width() - this->width());
                    target.setY(oldpos.y());
                    enableHS = true;
                    winHide =winHideType::none;
                }
        }
        if(true==enableHS){
//            qDebug()<<"show normal action..."<<winHide;
            winAnimation(target,oldpos);
        }
    }
}
其实就是show出来而已,就先只有这样了。

Qt界面篇:Qt界面之侧边栏隐藏和滑出 在实际的Qt界面布局设计中,特别是主界面中,经常会用到侧边栏的方式,然后在其中加入其他控件来复合使用,下面简单来实现一下Qt侧边栏的隐藏和显示 阅读详情

相关推荐

QT线段画板实战

将线段使用QVector进行保存,因为可能需要绘制多条线段. 鼠标按下和释放的时候记录起始和终点位置,并且保存在数据列表中. 鼠标移动过程中,动态刷新图像绘制,并且绘制临时坐标点(因鼠标没被释放,因此终点坐标随时变化)

啊渊的专栏 5848

Qt实现窗口吸附屏幕边缘 & 自动收缩

Qt实现窗口吸附屏幕边缘 & 自动收缩

wisdomroc的博客 1860

QDockWidget嵌套布局--仿PS组件拖拽/吸附效果

QDockWidget的使用示例,仿PS的组件窗口效果。

贝勒里恩的博客 1807

QT实现窗口可拖动

QT实现窗口可拖动 QT实现串口可拖动需要在窗口类中重写以下三个函数: virtual void mousePressEvent(QMouseEvent* event); virtual void mouseMoveEvent(QMouseEvent* event); virtual void mouseReleaseEvent(QMouseEvent* event); 同时定义以下三个类属性用于窗口拖动判断和位置偏移计算: bool m_bDragging; // 是否正在拖动 QPoint m_p

qq_41883523的博客 3158

Qt磁性窗口实现

Qt磁性窗口实现 Ubuntu10.04 Qt4.5.0

窗口靠边吸附隐藏模块

窗口靠边吸附隐藏模块 窗口靠边吸附隐藏模块 窗口靠边吸附隐藏模块

2.2.Qt中容器类型的控件

组框最常用的是给单选按钮组进行分类scroll Area 滚动区域scroll Area 滚动区域,在这个滚动区域中可以放置一个子窗口,如果这个子窗口比较大,不能在滚动窗口中完全显示出来,这个滚动窗口就会给子窗口自动添加一个垂直的或者水平的滚动条,保证子窗口的内容能够完全被现实出来工具盒子,工具箱,工具箱有很多层,每一层对应着一个窗口,可以通过切换不同的层显示不同的窗口,类似于qq或者wx的好友列表。frame内嵌到某一个窗口内部的时候是可以带边框的,widget不带边框。

丰锋的博客 126

为什么我的Win11家庭版找不到BitLocker?教你两种强制关闭加密的隐藏方法

本文解释了Win11家庭版为何缺少BitLocker功能,并提供了两种强制关闭加密的隐藏方法。通过注册表修改和PowerShell命令,用户可以调出隐藏的加密控制面板或直接操控加密引擎,解决家庭版设备加密的管理难题。

weixin_42535703的博客 1777

qt show widget_Qt的显示/隐藏部件动画

I'm trying to implement a show/hide widget animation. The widget is a QDockWidget and therefore is inside the QMainWindowLayout.Using QPropertyAnimation doens't seem to work, I got something looking l...

weixin_39595271的博客 766

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 526

Comsol 弧形声学换能器声聚焦仿真

1. 弧度和曲率半径:弧形声学换能器的形状和曲率半径对声聚焦效果有重要影响。通常,较小的曲率半径和较大的弧度可以实现更强的声聚焦效果。弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内,以实现更强的声场强度和分辨率。4. 数值仿真和优化:使用声学仿真软件进行数值仿真可以帮助设计和优化弧形声学换能器的声聚焦效果。通过调整几何参数、材料特性和激励信号等参数,可以模拟和优化声聚焦效果。2. 激励信号:通过调整激励信号的频率和幅值,可以实现声波在弧形声学换能器中的聚焦效果。

声学黑洞仿真工作室 1618

QT 设置QDialog显示与隐藏系统按钮(最大小化等)

QT中继承自QDialog的对话框默认情况下会显示如下效果: 如果想去掉或者添加系统按钮该如何处理呢(并不是每个按钮都想要),可以在代码中这样设置,设置效果是显示:标题,最小化按钮,最大化按钮,关闭按钮,那个问号帮助按钮去掉了 setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint| Qt::WindowCloseButtonHint); 具体每个属.

积累点滴,保持自我 5502

在 NVIDIA Orin (JetPack 6.0) 上配置 PyTorch 2.4 + Torchvision 0.19 的完整避坑指南

本文提供在NVIDIA Jetson Orin设备上,基于JetPack 6.0系统配置PyTorch 2.4与Torchvision 0.19环境的完整指南。通过使用Miniconda环境隔离、安装特定版本PyTorch夜间构建版、编译匹配的Torchvision源码等步骤,解决版本不匹配、CUDA支持等常见问题,确保AI开发环境稳定可用。

weixin_29179311的博客 365

QT之多个控件隐藏/显示(通用方法不仅适用于QT)

多个控件隐藏和显示 写在前面 在进行界面开发的工作时,常常涉及到不同界面的开发。尤其是通过菜单栏控制。 在前边,我们已经讲过如果将QT环境中的菜单栏点击事件与相应的功能(槽)函数进行连接,并实现相应的控件隐藏和显示。 但是一个成熟的软件,肯定单单有几个控件需要隐藏和显示。那么我们该如何做呢? 跟着我,一起往下看。 QT之容器控件 容器概念 容器控件是指允许在其内部添加其他控件的控件。在移动容器控件时,可以同时移动添加在容器内的控件。 特殊控件–页面类 在QT中包含着一些特殊的控件,这些控件看起来就像一个完整

MelyLenient的博客 1万+

避开ANSYS SOLID65钢筋模拟的坑:从材料TB到实常数R的完整配置清单

本文详细解析了ANSYS SOLID65单元在钢筋混凝土模拟中的关键配置与优化技巧,涵盖材料TB设置、实常数R配置及收敛性优化。特别针对钢筋建模的分布式钢筋模型进行深度解析,提供实战验证的参数设置手册,帮助工程师避免常见错误,提升模拟精度与效率。

weixin_30898555的博客 365

MiniMaxH3+ComfyUI本地部署:一键整合包、工作流搭建与报错排查

本地部署视频生成模型时,模型权重、推理框架与自定义节点的匹配是核心挑战。MiniMaxH3作为多模态生成模型,通常依赖ComfyUI这类节点式工作流引擎实现可视化调度。一键整合包将Python环境、PyTorch算子、模型文件预置封装,大幅降低部署门槛,并通过半精度加载、显存碎片回收等机制优化推理速度。在文生视频、图生视频与批量生成场景中,清晰的节点链路和参数调优能力直接影响输出质量与显存占用。针对模型不识别、节点执行失败等高频问题,系统排查命令行日志与模型目录可快速定位故障。本文以MiniMaxH3整合包

weixin_29047545的博客 584

qt 中widget/按钮等控件隐藏

  以QPushButton为例,如果想让他不显示,很多方法都可以实现。比如下边这五种都可以实现按钮的隐藏和显示。我们需要在合适的地方使用合适的方式。 this->setVisible(0); this->setVisible(1); // 隐藏控件在屏幕上显示、不再占位置会改变布局。 this->hide(); this->sho...

Beyond欣 3万+

Python电梯II

输入数据有若干组(最多不超过1000组),每组数据的第一行为四个如题目中所示的整数N,u,d,s,由空格分隔开。第二行为不同楼层需要上下楼的请求, 最多不超过1000个。每个请求的格式为"from-to",其中"from"和"to"为所在楼层和要到达的楼层,保证from!=to。

沐风—云端行者 910

QT布局管理(2)-停靠吸附窗口类QDockWidget,可用鼠标挪动控件位置/调整大小、Tab嵌套

帮助文件中指出,QDockWidget只能在QMainWindow及其子类中使用 QDockWidget的初始大小,实际上等于其子控件的QT推荐值大小sizeHint。由于sizeHint属性是只读的sizeHint(),如果想自定义QDockWidget的初始大小,只能继承一个QWidget或者QWidget的子类,并覆盖重写SizeHint()函数,在这个函数里返回自定义的推荐大小,详细步骤...

野生猿-群号1025127672 8526

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PyQt5实现侧面菜单栏-仿QQ设置--以及透明选中按钮效果(详细讲解)

Python--Qt抽屉栏切换界面仿QQ设计以及按钮透明和选中效果详解

qq_62095154的博客 5761

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Qt实现贴边隐藏

类似于qq,当窗口移动到桌面上边缘时,鼠标离开窗口,窗口将会自动向上隐藏,当鼠标回到靠边的位置,窗口又显示出来。 先看效果图: 代码如下 : widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> enum HIDEPOSATION//隐藏位置 { HP_None = 0, HP_Top = 1, HP_Left = 2, HP_Right = 3 }; class Widget

终曲 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Qt实现无边框窗口 + “窗口自动吸附”+“窗口阴影”+“窗口尺寸改变”

Qt实现无边框窗口实现“窗口自动吸附”+“窗口阴影”+“窗口尺寸改变”

qq_25704799的博客 585

QDockWidget组件的隐藏与显示(按钮控制)

用按钮控制QDockWidget组件的隐藏与显示

伊吹星星的博客 3048

Qt实现窗体在显示屏旁边自动隐藏(类似QQ)

Qt实现窗体在显示屏旁边自动隐藏(类似QQ)看群里有人问这个东西,本人先来无事编以自己的想法实现了下: 其实实现的点子很简单:void AutoHideWidget::leaveEvent(QEvent *event) { isAutoHide(); if (m_bIsAutoHide) { hideWidget(); } }void AutoHid

7938

QT界面窗口的显示和隐藏,关闭

QT界面窗口的显示和隐藏,关闭

qq_44681788的博客 2万+
上一篇: qt关于一些托盘,任务栏图标隐藏,无边框等的一些窗口的效果
下一篇: 在qt下使用qwt进行的统计图的绘制(配置 简单使用这些)
chaney_f
博客等级 码龄12年 30粉丝 21原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值