Qt 坐标位置转换

news2024/11/23 1:29:26

Qt 坐标位置转换

文章目录

  • Qt 坐标位置转换
    • 常见的位置坐标转换
    • Qt窗体中常用坐标的区别与获取途径
      • 当前光标相对于屏幕的绝对位置
      • 当前光标相对于当前窗口的位置
      • 鼠标事件发生的位置
      • 窗体的位置
      • 判断鼠标光标是否悬浮在某个子控件上

从事Qt快一年了 ,在做坐标转换的时候容易搞混 这边重新梳理一下 做一下总结

最主要的几种坐标系统:

  1. 窗口坐标(Window Coordinates):窗口坐标是相对于窗口左上角的坐标。在这个坐标系统中,原点(0,0)位于窗口的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,如果你在窗口中的某个位置点击鼠标,那么你得到的鼠标点击事件的坐标就是相对于窗口左上角的坐标。
  2. 显示器坐标(Screen Coordinates):显示器坐标是相对于整个显示器的坐标。在这个坐标系统中,原点(0,0)位于显示器的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,无论你在哪个窗口或者哪个部分的屏幕上点击鼠标,你得到的鼠标点击事件的坐标都是相对于显示器左上角的坐标。
  3. 父窗口坐标(Parent Coordinates):这是相对于父窗口(如果有的话)的坐标系统。原点(0,0)位于父窗口的左上角。这在处理嵌套窗口或控件时非常有用。
  4. 场景坐标(Scene Coordinates):这是在 QGraphicsScene 中使用的坐标系统,用于处理图形项的位置和变换。原点(0,0)可以在场景的任何位置,默认在中心 这取决于你如何设置和使用场景。
  5. 视图坐标(View Coordinates):这是在 QGraphicsView 中使用的坐标系统,用于处理视图滚动和缩放。原点(0,0)位于视图的左上角。

常见的位置坐标转换

  1. QPoint QMouseEvent::pos()
    这个只是返回鼠标事件相对这个widget(重载了QMouseEvent的widget)的位置。
  2. QPoint QMouseEvent::globalPos()
    窗口坐标,这个是返回鼠标的全局坐标,相对于屏幕的左上角
  3. QPoint QCursor::pos()
    返回相对显示器的全局坐标
  4. QPoint QWidget::mapToGlobal(const QPoint & pos) const
    将窗口坐标转换成显示器坐标
  5. QPoint QWidget::mapFromGlobal(const QPoint & pos) const
    将显示器坐标转换成窗口坐标
  6. QPoint QWidget::mapToParent(const QPoint & pos) const
    将窗口坐标获得的pos转换成父类widget的坐标
  7. QPoint QWidget::mapFromParent(const QPoint & pos) const
    将父类窗口坐标转换成当前窗口坐标
  8. QPoint QWidget::mapTo(const QWidget * parent, const QPoint & pos) const
    将当前窗口坐标转换成指定parent坐标。
  9. QWidget::pos() : QPoint
    这个属性获得的是当前目前控件在父窗口中的位置
  10. const QPointF & QMouseEvent::screenPos() constQPoint QMouseEvent::globalPos() 值相同,但是类型更高精度的QPointF
    请添加图片描述

请添加图片描述

例如 pWidget->mapToGlobal(QPoint(x,y));即 把你在pWidget里面的坐标(x,y) 所表示的点. 用Global的坐标表示 即 pWidget->mapToGlobal(QPoint(0,0)) +QPoint(x,y) = pWidget->mapToGlobal(QPoint(x,y)) 如图:

请添加图片描述

Qt窗体中常用坐标的区别与获取途径

当前光标相对于屏幕的绝对位置

QCursor::pos()

当前光标相对于当前窗口的位置

this->mapFromGlobal(QCursor::pos())

鼠标事件发生的位置

void MainWindow::mouseReleaseEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();             //相对于当前窗口的位置
    QPoint globalPos = event->globalPos();    //相对于屏幕的全局绝对位置
}

窗体的位置

QWidget *widget = new QWidget();
widget.pos();    //窗体的左上角的位置

判断鼠标光标是否悬浮在某个子控件上

获取子窗口geometry,判断是否包含光标所在的坐标,如果是,则表示光标正悬浮在该子控件上。

注意:

**geometry()是相对于父窗口的相对位置,而QCursor::pos()获取的是鼠标绝对位置。**需要进行一次转换,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里采用将鼠标绝对位置换算到控件上,示例代码如下:

if(ui->pushButtonTest->geometry().contains( this->mapFromGlobal(QCursor::pos())))
{
    //do something...
}

参考demo

传入的坐标原则为mapTo接口传入以自身左上角为原点的坐标,mapFrom类型接口传入以global/parent左上角为原点的坐标

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

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

相关文章

钡铼技术R40工业4G路由器加速推进农田水利设施智能化

钡铼技术R40工业4G路由器作为一种先进的通信设备,正在被广泛应用于各行各业,其中包括农田水利设施的智能化改造。通过结合钡铼技术R40工业4G路由器,农田水利设施可以实现更高效的管理和运营,提升农田灌溉、排水等工作效率&#xf…

OpenAI的GPT已达极限,更看好AI Agent

日前,比尔盖茨发表文章表示:AI Agent不仅会改变人与电脑的互动方式,或许还将颠覆软件行业,引领自输入命令到点击图标以来的最大计算机革命。 在数字化和技术创新的浪潮中,AI Agent作为一种前沿技术,正开启…

基于 HBase Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步

目录 一、总体架构 二、安装配置 MySQL 1. 创建 mysql 用户 2. 建立 MySQL 使用的目录 3. 解压安装包 4. 配置环境变量 5. 创建 MySQL 配置文件 6. MySQL 系统初始化 7. 启动 mysql 服务器 8. 创建 dba 用户 三、配置 MySQL 主从复制 四、安装部署 Kafka Connector…

Docker常用命令!!!

一、docker基础命令 1、启动docker systemctl start docker 2、关闭docker systemctl stop docker 3、重启docker systemctl restart docker 4、docker设置随服务启动而自启动 systemctl enable docker 5、查看docker 运行状态 systemctl status docker 6、查看docker 版本号信…

ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助学员掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战…

Learn OpenGL 19 几何着色器

几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方…

IOS/Android App备案(uniapp)

IOS/App备案 IOS备案Android备案 IOS备案 准备好p12证书即可 链接: https://aitoolnav.caichuangkeji.com/#/AppMd5 Android备案 上DCLOUD开发者中心,找到相关应用后,直接查看证书即可获取到MD5 公钥:先根据上述页面下载证书,…

应急响应-Web2

应急响应-Web2 1.攻击者的IP地址(两个)? 192.168.126.135 192.168.126.129 通过phpstudy查看日志,发现192.168.126.135这个IP一直在404访问 , 并且在日志的最后几条一直在访问system.php ,从这可以推断 …

Git原理与使用(一)

目录 前言 版本控制器 Linux下的Git的安装 Git的基本操作 创建Git本地仓库 配置Git 工作区、暂存区、版本库 添加与提交 查看.git文件 前言 我们可能要写多个文档对一个产品进行描述,但是一般情况下我们可能要写多个文档,比如: 初…

Rust Rocket简单入门

简介 Rust中最知名的两个web框架要数Rocket和Actix了,Rocket更注重易用性,Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程,就学一下最简单的 Rocket。 Rocket 是一个用于 Rust 的异步 Web 框架,专注于可用性、安全性…

NCV4266ST50T3G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述: NCV4266 是一款集成了 150 mA 输出电流的低漏稳压器系列,可用于严酷汽车环境。它包括了较宽的运行温度范围和输出电压范围。该器件提供 3.3 V、5.0 V 固定电压版本,以及可调电压版本,输出电压准确度为 2%。它具有较高的…

web攻防——csrf,ssrf

csrf 当我们在访问自己的管理员系统的时候,打开别人发的钓鱼连接就会自动增加管理员(前提,后台在登录状态)当我们打开别人发的网站,就会触发增加管理员的数据包 假设我们要测试这个网站 看到这个,就得下载一…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥,定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…

Vue+Element-UI Table表格实现复选框单选效果(隐藏表头上的全选Checkbox)

实现效果 完整代码 <div class"box-pos"><el-table ref"table" :header-cell-style"{ color: #FFF, background: #333 }":cell-style"{ color: #FFF, background: #333 }" :data"grListData" style"width: 1…

网状的隧道穿梭特效HTML代码

网状的隧道穿梭特效HTML代码&#xff0c;效果是动态的&#xff0c;可以下载源码&#xff0c;自己在本地运行 源码下载 网状的隧道穿梭特效HTML代码

uni-app 中两个系统各自显示不同的tabBar

最近在一个uni-app项目中遇到一个需求,在登录页面成功登录以后需要判断身份,不同的身份的进入不同的tabBar页面,但是在uni-app项目中pages.json中的tabBar的list数组只有一个&#xff0c;且不能写成动态的,那如何实现这个需求呢?答案是需要我们自定义tabBar。 目录 1、我们确…

关于paper中的一些硬件知识

一. OS中的event Information in event traces from software systems can help developers with performance analysis, debugging and troubleshooting 1.事件的概念 已知软件系统中的event能够帮助开发者对系统进行性能分析、调试以及定位&#xff0c;那我们应该仔细考虑…

简单了解:localhost 与 127.0.0.1 的区别

在信息技术的世界里&#xff0c;localhost和127.0.0.1频繁出现在各种网络及软件开发的场景之中。它们似乎指向同一个意义——那就是你的本地机器。但仔细探究之下&#xff0c;你会发现它们之间其实存在着一些微妙的差异。今天&#xff0c;我们就来深究这两者之间的区别&#xf…

Maxwell监听mysql的binlog日志变化写入kafka消费者

一. 环境&#xff1a; maxwell:v1.29.2 (从1.30开始maxwell停止了对java8的使用&#xff0c;改为为11) maxwell1.29.2这个版本对mysql8.0以后的缺少utf8mb3字符的解码问题&#xff0c;需要对原码中加上一个部分内容 &#xff1a;具体也给大家做了总结 &#xff1a; 关于v1.…

GaussDB(分布式)实例故障处理

一、说明 GaussDB Kernel实例出现故障时&#xff0c;可以按照本节的办法进行实例快速修复。 1、执行gs_om -t status --detail查看集群状态&#xff0c;cluster_state为Normal&#xff0c;balanced为No&#xff0c;请重置实例状态。 2、执行gs_om -t status --detail查看集群…