【二十五】【QT开发应用】无边窗窗口鼠标拖动窗口移动,重写mousePressEvent,mouseMoveEvent函数

news2024/11/9 4:42:04

在 Qt 中,可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件,以便实现例如拖动窗口等功能。

mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数,我们对这两个函数进行重写实现拖动无边窗窗口的效果。

重写两个函数完成拖动窗口的功能

在这里插入图片描述

代码

#include "MainWidget.h"
#include <QMoveEvent>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMaximizeButtonHint);
}

MainWidget::~MainWidget()
{}

void MainWidget::mousePressEvent(QMouseEvent * event) {
    window_pos = this->pos();
    mouse_pos = event->globalPos();
    diff_pos = mouse_pos - window_pos;

}

void MainWidget::mouseMoveEvent(QMouseEvent* event) {
    QPoint pos = event->globalPos();

    this->move(pos - diff_pos);
}

这段代码实现了一个简单的拖动窗口的功能,通过鼠标按下和移动事件,可以让 MainWidget 这个窗口随鼠标拖动。

1. mousePressEvent(QMouseEvent* event)

这个函数捕获鼠标按下事件,记录当前窗口的位置和鼠标的位置,以及它们之间的差值。

void MainWidget::mousePressEvent(QMouseEvent* event) {
    // 记录窗口的当前位置
    window_pos = this->pos();  // 获取窗口的当前坐标

    // 记录鼠标的全局位置(相对于屏幕)
    mouse_pos = event->globalPos();  // 获取鼠标相对于屏幕的位置

    // 计算鼠标位置和窗口位置之间的差值
    diff_pos = mouse_pos - window_pos;  // 这是当点击窗口时鼠标与窗口左上角之间的差值
}
  • this->pos():获取窗口的当前位置(相对于屏幕的左上角)。
  • event->globalPos():获取鼠标在屏幕上的位置(相对于屏幕的左上角)。
  • diff_pos:计算鼠标位置和窗口左上角之间的差值,用于保持窗口的相对移动。
2. mouseMoveEvent(QMouseEvent* event)

这个函数捕获鼠标移动事件,并通过拖动鼠标移动窗口。

void MainWidget::mouseMoveEvent(QMouseEvent* event) {
    // 获取鼠标的全局位置(相对于屏幕)
    QPoint pos = event->globalPos();  // 获取当前鼠标相对于屏幕的位置

    // 移动窗口,保持鼠标与窗口之间的相对位置不变
    this->move(pos - diff_pos);  // 将窗口移动到新位置
}
  • event->globalPos():获取鼠标当前位置(相对于屏幕的全局坐标)。
  • this->move(pos - diff_pos):通过新的鼠标位置和之前计算的差值来计算窗口的新位置,并移动窗口。

功能总结:

  • 当鼠标按下时,记录当前窗口位置和鼠标位置,并计算它们之间的相对偏移量 diff_pos
  • 当鼠标移动时,根据鼠标的新位置和偏移量 diff_pos,实时更新窗口的位置,从而实现窗口的拖动。

使用场景:

  • 这个功能常用于无边框窗口 (Qt::FramelessWindowHint),允许用户通过点击并拖动窗口的内容区域来移动整个窗口。

代码解析

在这里插入图片描述

this->pos()表示以整个桌面的左上角为坐标原点,当前窗口左上角的矢量向量,即窗口坐标。
event->globalPos()表示以整个桌面的左上角为坐标原点,当前鼠标的矢量向量,即鼠标坐标。
this->move()表示将窗口左上角设置为怎样的坐标,同样是以整个桌面的左上角为坐标原点。

5号坐标是鼠标移动之后的坐标,我们可以直接通过event->globalPos()获取。
我们需要得到6号坐标,这样我们就可以直接设置鼠标移动之后的窗口位置,即this->move(6号坐标)
6号坐标怎么得到?五号坐标减去4号坐标,4号坐标等价于3号坐标。
坐标的实际含义是向量,带箭头的线段。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

prithvi WxC气象模型

NASA发布了prithvi WxC气象模型发布 Prithvi是NASA开源的模型&#xff0c;被誉为全球最大的开源地理空间大模型。昨天晚上逛X平台&#xff0c;我看到Prithvi模型又来了新成员&#xff1a;prithvi WxC。 NASA和IBM创建了一个基于MERRA-2数据的天气和气候AI基础模型—Prithvi Wx…

C++ :借助栈完成二叉树的非递归遍历

二叉树的传统访问分为&#xff1a;前序、中序、后序、层序。 其中前三者是递归访问&#xff0c;但是递归是有缺陷的&#xff0c;树太深就会栈溢出。 因此本文我们思考如何使用非递归的方法来完成遍历。 1. 前序遍历 要迭代⾮递归实现⼆叉树前序遍历&#xff0c;⾸先还是要借…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16&#xff5e;K23二进制拨动开关作为DBUS数据输入端&#xff0c;其它开关作为控制信号的输入端&#xff0c;将通过K16&#xff5e;K23设定…

无人经济已经 next level 了吗?

01 从无人售货机开始… 晚上 11 点下班回到小区&#xff0c;顺便去驿站取个快递&#xff0c;走进驿站发现四周空无一人&#xff0c;把快递放在机器上滴一声就可以走人了。走的时候在旁边的无人超市里拿一袋方便面&#xff0c;当做加班的安慰……发现了吗&#xff0c;无人门店…

ret2dl_resolve

前言&#xff1a; ret2dl_resolve 是一种利用漏洞进行攻击的技术&#xff0c;主要针对使用动态链接库的程序。它的核心原理是利用程序的重定位机制&#xff0c;通过构造特定的函数返回地址&#xff0c;来劫持控制流并执行攻击者选择的代码。以下是对 ret2dl_resolve 原理的详细…

谷歌地图 | Navigation SDK 重磅发布!为你的 App 注入导航新体验

9月17日&#xff0c;Google 地图正式发布 Navigation SDK for Android 和 iOS&#xff01;借助 Navigation SDK&#xff0c;开发者们现在可以更轻松地为用户打造定制化的导航体验&#xff0c;提升用户满意度&#xff0c;增强用户粘性。无论是界面风格、路线规划还是实时交通信息…

城市酷选:如何四年做到3000亿销售额 会员超500w

城市酷选&#xff0c;这一融合了线上线下消费的会员制社交电商平台&#xff0c;正以其独特的运营模式在市场中崭露头角。该平台不仅汇聚了超过600万的会员与60万商家&#xff0c;更实现了年交易额的百亿突破&#xff0c;彰显了其强大的市场影响力和消费者吸引力。 创新排队免单…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…

FileLink跨网文件传输 | 跨越网络边界的利器,文件传输不再受限

在当今数字化时代&#xff0c;企业与个人对文件传输的需求不断增长&#xff0c;尤其是在跨网环境中。传统的文件传输方式常常受到网络带宽、传输速度和安全性的限制&#xff0c;给用户带来了诸多不便。FileLink 的出现&#xff0c;为这一难题提供了完美解决方案&#xff0c;让文…

理解Web3:去中心化互联网的基础概念

随着科技的不断进步&#xff0c;互联网的形态也在不断演变。从最初的静态网页&#xff08;Web1&#xff09;到动态的社交网络&#xff08;Web2&#xff09;&#xff0c;如今我们正步入一个新的阶段——Web3。这一新兴概念不仅代表了一种技术革新&#xff0c;更是一种互联网使用…

RocketMQ简介与应用场景

简介 RocketMQ是一个由阿里巴巴开源并捐献给Apache的分布式消息中间件&#xff0c;具有高吞吐、低延迟、海量消息堆积等特点&#xff0c;广泛应用于各种分布式系统和大规模数据处理场景。 核心特征 1、高吞吐与低延迟&#xff1a;RocketMQ支持极高的消息吞吐量和极低的消息延…

优思学院|ABC成本方法与精益管理

传统企业计算成本主要基于直接费用。其次的间接费用只需根据某项标准&#xff08;作业时间等&#xff09;&#xff0c;粗略地将费用分配给各种产品即可。 近来&#xff0c;生产线自动化与间接业务高度复杂化&#xff0c;间接费用在制造成本中的比重越来越高&#xff0c;传统的…

netty编程之那么多的网络框架为啥非选你?

写在前面 java nio框架不止一种&#xff0c;为啥非选netty&#xff1f;本文来看下。 1&#xff1a;正文 网络io框架&#xff0c;除了netty外&#xff0c;还有mina&#xff0c;sun grizzly&#xff0c;cindy等&#xff0c;为啥独选netty。 mina netty和mina作者同属一人&…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 制作数据集 Labelme 数据集 数据集选用自己标注的&#xff0c;可参考以下&#xff1a…

用ArcMap实现可视域分析

在 ArcToolbox>>3D Analyst>>可见性>>视域&#xff0c;输入值如图所示&#xff1a; 设置完成后点击确认&#xff0c;生成可视域分析图层 Viewshe1&#xff0c;由内容列表 可见&#xff0c;红色为不可见&#xff0c;绿色为可见。 改变观察点的高度&#xff1a…

pycharm下载selenium等软件包时提示下载超时

1.问题描述 我今天在pycharm运行刚写的自动化脚本时&#xff0c;提示selenium模块未导入&#xff08;自动到导入&#xff09;&#xff0c;鼠标移动到【from selenium import webdriver]的selenium时&#xff0c;显示【未存在文档】 2 解决办法 文件--设置--项目&#xff1a;当前…

企业智能培训新方案,高效打造金牌员工

标品市场竞争激烈&#xff0c;小微企业因长期专注于非标业务或者偏定制化路线&#xff0c;在团队专业能力与大型企业间存在显著差距。专业人才短缺、培养成本高企、培训滞后、效果难测、资源不均、考核标准不一及知识转化率低等问题&#xff0c;成为其业务转型的绊脚石。 如何高…

红外热成像应用场景!

1. 电力行业 设备故障检测&#xff1a;红外热成像仪能够检测电气设备&#xff08;如变压器、电线接头&#xff09;的过热现象&#xff0c;及时发现并定位故障点&#xff0c;预防火灾等安全事故的发生。 水电站查漏&#xff1a;在水电站中&#xff0c;红外热成像仪可用于快速查…

windows自带的录屏功能好用吗?这4款录屏工具也是不错的选择。

因为现在很多人都会有录屏需求&#xff0c;所以平常使用的一些设备当中会有自带的录屏功能。比如windows10系统下只要按下键盘上的 “WinG” 键&#xff0c;就可打开录屏功能。但是录制的时长会有限制&#xff0c;并且录屏功能会有些限制。如果对录屏有更多的需求&#xff0c;可…

网络设备驱动中的调试级别msglevel

网络设备驱动调试级别可以在驱动初始化过程中赋初值&#xff0c;并通过ethtool_ops中.get_msglevel获取&#xff0c;通过.set_msglevel进行设置或修改&#xff0c;并通过如netif_msg_drv这样的宏函数来在需要打印调试信息时进行判断&#xff0c;为真时输出对应级别的调试信息&a…