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

先看效果:

N年前的QQ就可以吸附到屏幕边缘,聊天时候非常方便,不用点击状态栏图标即可呼出QQ界面

自己尝试做了一个糙版的屏幕吸附效果。

关键代码:

cpp 复制代码
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    int dx = e->globalX() - lastPoint_.x();
    int dy = e->globalY() - lastPoint_.y();

    int targetx,targety;
    bool enableAnimation = false;

    if(mousePress_ == false) {
        return;
    }

    //! 垂直方向
    if(this->y() < EdgeAttachMargin && this->y() != 0) {
        //! 吸附顶部
        targety = 0;
        enableAnimation = true;
    } else {
        targety = this->y();
    }

    //! 水平方向
    if(this->x() < EdgeAttachMargin && this->x() != 0) {
        //! 吸附左边
        enableAnimation = 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();
            enableAnimation = 1;
        } else {
            targetx = this->x();
        }
    }

    if(1 == enableAnimation){
        if(targetx == 0) {
            hideType_ = HideType::to_xleft;
        } else if(targetx == QApplication::desktop()->width()-this->width()) {
            hideType_ = HideType::to_xright;
        } else if(targety == 0) {
            hideType_ = HideType::to_y;
        }

        startAnimation(QPoint(targetx,targety),QPoint(this->x(),this->y()));
    } else {
        if(hideType_ == HideType::xleft) {
            int adjustX = x();
            int adjustY = y() + dy;
            if(dx > EdgeAttachMargin) {
                adjustX = x() + dx;
                hideType_ = HideType::none;
                lastPoint_.rx() = e->globalX();
            }
            this->move(adjustX, adjustY);
            lastPoint_.ry() = e->globalY();
        } else if (hideType_ == HideType::xright) {
            int adjustX = x();
            int adjustY = y() + dy;
            if(dx < -EdgeAttachMargin) {
                adjustX = x() + dx;
                hideType_ = HideType::none;
                lastPoint_.rx() = e->globalX();
            }
            this->move(adjustX, adjustY);
            lastPoint_.ry() = e->globalY();
        } else if(hideType_ == HideType::y) {
            int adjustX = x() + dx;
            int adjustY = y();
            if(dy > EdgeAttachMargin) {
                adjustY = y() + dy;
                hideType_ = HideType::none;
                lastPoint_.ry() = e->globalY();
            }
            this->move(adjustX, adjustY);
            lastPoint_.rx() = e->globalX();
        } else {
            int adjustX = x() + dx;
            int adjustY = y() + dy;
            if(adjustX < 0) adjustX = 0;
            if(adjustX > QApplication::desktop()->width() - width()) adjustX = QApplication::desktop()->width() - width();
            if(adjustY < 0) adjustY = 0;
            if(adjustY > QApplication::desktop()->availableGeometry().height() - height()) adjustY = QApplication::desktop()->availableGeometry().height() - height();
            this->move(adjustX, adjustY);
            lastPoint_   = e->globalPos();
        }
    }
}

鼠标悬停展开 / 离去收缩功能,

主要依据void enterEvent(QEvent *event); & void leaveEvent(QEvent *event);两个函数展开

动画效果使用QPropertyAnimation进行,可以参见另一篇博文中的例子:https://blog.csdn.net/wisdomroc/article/details/135975578


全套代码链接:Qt实现窗口吸附屏幕边缘 & 自动收缩

相关推荐
Qt历险记1 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
qt
宏笋2 小时前
一款集结古今中外文学查阅与编辑的软件
qt
机器视觉知识推荐、就业指导12 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan12 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子12 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化13 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_6952514913 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
小小龙学IT19 小时前
Qt 元对象系统(Meta-Object System)深度解析:从 MOC 到反射式编程
数据库·qt
小王C语言21 小时前
QT 基础:QT SDK 下载、配置、新建项目、项目代码解释
开发语言·qt
张人玉1 天前
基于 Python + PyQt5 的水果目标检测与分割可视化系统——水果深度学习识别可视化大屏
python·深度学习·qt·目标检测·sqlite·echarts