实现拖动标题栏窗口恢复+窗口跟着鼠标移动

窗口跟着鼠标移动

1.重写鼠标按下事件,记录鼠标在窗口中的相对位置

2.重写鼠标移动事件,调用move方法使得窗口移动到鼠标的位置(调用globalPos方法获取鼠标的位置)

3.注意点:移动时鼠标的位置还要减去一开始的相对位置,否则,窗口直接就是左上角跟着鼠标移动了,没有保持最开始鼠标和窗口的相对位置

如下,鼠标位置没有减去相对位置,就会出现下面的情况:

 拖动标题栏窗口恢复

1.鼠标按下事件记录是否是在标题栏按下

2.鼠标移动事件中,如果是在标题栏按下,那么窗口恢复,同时记录窗口最大化时的宽度,以及用一个标记变量记录窗口从最大化恢复到了正常状态

3.如果窗口是正常状态,那么窗口跟着鼠标移动,注意此时要更新前面记录的那个相对位置的值,既然窗口从最大化变为了正常,那么我一开始在窗口按下的相对位置也要进行同比例的变化。

如果不变化就会出现下面的情况:

 完整代码如下:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QLabel>
#include<QPushButton>
#include<QMouseEvent>
#include<QHBoxLayout>
#include<QBoxLayout>
#include<QApplication>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr):QWidget(parent){//去掉自带的标题栏setWindowFlag(Qt::FramelessWindowHint);setStyleSheet(R"(font-family:"Microsot YaHei";font-size:12px)");//整个窗口垂直布局QVBoxLayout* v_box=new QVBoxLayout(this);v_box->setContentsMargins(0,0,0,0);v_box->setSpacing(0);//创建标题栏title_bar=new QWidget(this);title_bar->setFixedHeight(60);title_bar->setStyleSheet(R"(.QWidget{background-color:#edf5f9})");//标题栏水平布局QHBoxLayout* h_box=new QHBoxLayout(title_bar);h_box->setContentsMargins(0,0,0,0);h_box->setSpacing(0);//创建窗口标题window_title=new QLabel(this);window_title->setText("自定义标题栏");window_title->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);h_box->addWidget(window_title);//创建最大化按钮btn_max=new QPushButton(this);btn_max->setFixedSize(100,50);btn_max->setText("点我最大化");h_box->addWidget(btn_max);//创建窗口主体body=new QWidget(this);body->setStyleSheet("background-color:gray");v_box->addWidget(title_bar);v_box->addWidget(body);resize(700,500);//绑定槽函数,最大化窗口connect(btn_max,&QPushButton::clicked,this,[=](){//窗口为正常状态if(windowState().testFlag(Qt::WindowNoState)){//则点击后变为最大this->setWindowState(Qt::WindowMaximized);btn_max->setText("点我恢复");}else if(windowState().testFlag(Qt::WindowMaximized)){//窗口为最大化,点击则恢复正常this->setWindowState(Qt::WindowNoState);btn_max->setText("点我最大化");}});}~Widget()=default;protected://实现鼠标拖动窗口移动//实现最大化窗口时,在标题栏按下,然后拖动,窗口恢复原来的大小void mousePressEvent(QMouseEvent* ev){//记录鼠标在窗口中的相对位置press_pos=ev->pos();QPoint global_press_pos=ev->globalPos();if(title_bar==QApplication::widgetAt(global_press_pos)||window_title==QApplication::widgetAt(global_press_pos)){//记录按下的位置是标题栏press_in_title=true;}}void mouseMoveEvent(QMouseEvent* ev){//鼠标按下后拖动,如果此时窗口时最大状态,且是在标题栏按下if(windowState().testFlag(Qt::WindowMaximized)&&press_in_title){//记录窗口最大化时的宽度width_of_max=width();//那么窗口恢复正常setWindowState(Qt::WindowNoState);btn_max->setText("点我最大化");//标记一下窗口从最大变为正常了max_to_normal=true;//需要注意的的是窗口恢复正常后,width()方法获取的宽度不会立即更新}//正常状态下,鼠标拖动窗口移动if(windowState().testFlag(Qt::WindowNoState)){//获取窗口当前的宽度int width_of_now=width();if(max_to_normal &&width_of_now!=width_of_max){//如果窗口从最大化变为了正常,且窗口前后宽度不相等//此时就需要更新press_pos的值//来保持恢复正常之后,鼠标在窗口的位置,仍然是刚按下时,鼠标在窗口的位置//那么最开始按下的相对位置也要等比例缩小//算出比值,正常状态下的宽度比上最大化时的宽度float ratio=width_of_now/(float)width_of_max;press_pos*=ratio;//标记变量复原max_to_normal=false;}//正常状态下,鼠标移动,窗口跟着移动,则需要减去最开始的相对位置。//否则就会是窗口的左上角跟着鼠标移动this->move(ev->globalPos()-press_pos);}}void mouseReleaseEvent(QMouseEvent* ev){//鼠标释放后标记变量复原press_in_title=false;}private:bool press_in_title=false;//记录是否在标题栏按下bool max_to_normal=false;//记录窗口从最大变为正常int width_of_max;//记录窗口最大化下时的宽度QPoint press_pos;//记录鼠标按下时的在窗口中的位置QWidget* title_bar;//标题栏QLabel* window_title;//窗口标题QPushButton* btn_max;//最大化按钮QWidget* body;//窗口主体区
};
#endif // WIDGET_H

正确效果如下:

 学习链接:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536025.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你全面了解RAID技术:从基础到进阶的全景解析

一、引言 在如今这个数据爆炸的时代&#xff0c;数据的存储和安全性显得尤为重要。RAID技术作为一种将多块硬盘组合成一个逻辑单元&#xff0c;以实现数据冗余和性能优化的技术&#xff0c;被广泛应用于企业级和个人数据存储中。本文将对RAID的常见级别进行详细解析&#xff0…

[C语言]第九节 函数一基础知识到高级技巧的全景探索

目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例&#xff1a;常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 ​编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参&#xff1f; 9…

影刀RPA实战:网页爬虫之CSDN博文作品数据

今天我们使用影刀来采集网页数据&#xff0c;影刀RPA是一款功能强大的自动化办公软件&#xff0c;它可以模拟人工的各种操作&#xff0c;帮助企业自动处理大量重复性、有逻辑规则的工作。影刀RPA在网页数据采集方面表现出色&#xff0c;能够实现对任何桌面软件、Web程序的自动化…

NeMo Curator 整理用于 LLM 参数高效微调的自定义数据集

目录 概述 预备知识 定义自定义文档构建器 下载数据集 解析和迭代数据集 将数据集写入 JSONL 格式 使用文档构建器加载数据集 使用现有工具统一 Unicode 格式 设计自定义数据集过滤器 编辑所有个人识别信息 添加指令提示 整合管线 概述 出于演示目的&#xff0c;本…

6芯7芯可旋转电连接器航空插头

概述 可旋转电航空插头是一种能够在旋转或相对运动的部件间稳定传输电气信号或电源的装置&#xff0c;广泛应用于航空航天、自动化设备、医疗设备等多个领域。它的核心在于精密的接触系统&#xff0c;由旋转端和固定端两部分组成&#xff0c;通过金属触点或导电环实现电气连接。…

哪些网站用python开发

国内的话&#xff0c;知乎&#xff0c;网易&#xff0c;腾讯&#xff0c;搜狐&#xff0c;金山&#xff0c;豆瓣这些属于用Python比较知名的。大型的项目的话&#xff0c;网易的许多游戏&#xff0c;腾讯的某些网站&#xff0c;搜狐的邮箱&#xff0c;金山的测试框架等等都是或…

实习期间git的分枝管理以及最常用的命令

各位找工作实习的友友在工作之前一定要把git的相关知识掌握呀&#xff0c;我实现期间被leader说过关于git规范的相关问题了 目前已更新系列&#xff1a; 当前&#xff1a;:实习期间git的分枝管理以及最常用的命令 Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种…

【JavaEE初阶】多线程(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…

springboot3.X版本集成mybatis遇到的问题

由于我本地springboot为3.x版本&#xff0c;如下图所示&#xff0c;最新版本 当我参照如下搜索的内容去集成mybatis的时候&#xff0c;会出现各种各样的报错 最根本的原因是搜出来的配置是参照springboot2.X版本&#xff0c;当我们使用springboot3.x版本之后&#xff0c;需要配…

JVM 垃圾回收机制和GC案例分析

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制&#xff0c;是自动内存管理的重要组成部分。它通过回收不再使用的对象&#xff0c;避免手动释放内存的麻烦。然而&#xff0c;随着系统复杂性的增加&#xff0c…

4.C_数据结构_队列

概述 什么是队列&#xff1a; 队列是限定在两端进行插入操作和删除操作的线性表。具有先入先出(FIFO)的特点 相关名词&#xff1a; 队尾&#xff1a;写入数据的一段队头&#xff1a;读取数据的一段空队&#xff1a;队列中没有数据&#xff0c;队头指针 队尾指针满队&#…

劳特巴赫ICD调试器CMM调用烧录框架固件研究之C语言版本

接到客户一个项目是基本GD32F301C8XX的,尝试用手上的劳特巴赫仿真器对它进行开发操作,发现总是提示“FLASH algorithm did not execute completely” 怀疑是底层调用用烧录固件“~~/demo/arm/flash/word/stm32f300.bin”与芯片不兼容造成的,于是有了这编研究文档,多的不说直…

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一&#xff1a;属性注入 场景二&#xff1a;set注入 场景三&#xff1a;构造方法注入 场景四&#xff1a;形参注入 场景五&#xff1a;只有一个构造函数&#xff0c;无注解 场景六&#xff1a;Autowired和Quali…

Tcl lnit error: Can’t find a usable init.tcl in the following directories 问题解决

这个问题出现在我用py2exe打包了一个包含tkinter的图形化界面&#xff0c;在当前电脑上运行无问题&#xff0c;在移动到新电脑上后提示报错、 这里吐槽一下&#xff0c;新电脑上报错信息一闪而过&#xff0c;我用的土法子解决的&#xff0c;就是录视频然后0.25倍速度暂定找到报…

Acrobat 9 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton> #include<QStatusBar> #include<QLabel> #include<QDockWidget> #include<QTextEdi…

将事物分为三教九流?不妨通过logistic回归

和多元线性回归一样&#xff0c;逻辑回归也是建立“多对一”型变量之间的线性关系——也即找出线性方程的近似解。有所不同的是&#xff0c;逻辑回归的解只能出现0~1之间&#xff08;亦或就是0/1两种结果&#xff09;&#xff0c;这倒是有点像bool型和int型之间的区别了。实际上…

S32K3 工具篇7:如何使用VScode编译EB MCAL工程

S32K3 工具篇7&#xff1a;如何使用VScode编译EB MCAL工程 1. VScode工具与配置2. 使用VScode编译RTD MCAL工程2.1 使用EB tresos生成配置2.2 VScode 打开工程2.3 修改mk文件2.4 编译文件2.5 debug生成好的elf文件 对于EB配置的MCAL代码&#xff0c;通常是基于RTD去做&#xff…

GEO IGEO MEO介绍 和 北斗导航系统使用三轨道原因

GEO IGSO MEO基本轨道知识 中地球轨道&#xff08;MEO&#xff1a;Middle Earth Orbit&#xff09; 轨道高度2000-36000kmGPS、GLONASS都属于此类轨道 地球同步轨道&#xff08;或称对地静止轨道&#xff09;[同步转动] 轨道高度约为36000 km&#xff1b;此轨道上卫星运行方…

情感识别系统源码分享

情感识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …