qt-C++语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系

qt-C++语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系

code review!

文章目录

  • qt-C++语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系
      • 1.所属的类和作用
        • 1.1.方法签名
        • 1.2.参数
        • 1.3.返回值
      • 2.坐标系的概念
      • 3.使用案例
        • 3.1.示例代码
        • 3.2.输出结果
      • 4.和其他方法的区别
        • 4.1.区别总结:
      • 5.注意事项
      • 6.实际应用场景
      • 7.总结

mapToGlobal 是一个常见于 GUI 框架(例如 Qt)的方法,用于将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系。它的主要作用是将局部坐标(以组件左上角为原点的坐标系)转换为屏幕上的全局坐标。

以下是对 mapToGlobal 方法的详细解释:

1.所属的类和作用

在 Qt 中,mapToGlobalQWidget 类的一个函数,主要用于将控件的局部坐标(local coordinates)映射到屏幕上的全局坐标(global coordinates,通常是以屏幕左上角为原点的坐标系)。

1.1.方法签名
QPoint QWidget::mapToGlobal(const QPoint &pos) const
1.2.参数
  • pos:一个 QPoint 类型的点,表示控件局部坐标系中的点。
1.3.返回值
  • 返回一个 QPoint,表示该点在屏幕上的全局坐标。

2.坐标系的概念

在 GUI 编程中,通常有以下几种坐标系:

1.局部坐标系(Local Coordinates)

  • 以控件的左上角为原点 (0, 0),控件的大小决定了这个坐标系的范围。
  • 比如,一个按钮的局部坐标系以按钮自身的左上角为原点。

2.父坐标系(Parent Coordinates)

  • 以控件的父控件的左上角为原点。

3.全局坐标系(Global Coordinates)

  • 以整个屏幕的左上角为原点 (0, 0),无论控件嵌套层级如何,最终都会映射到屏幕上的绝对位置。

3.使用案例

假设我们有一个按钮,它位于窗口中的局部坐标 (50, 30),而这个窗口本身在屏幕上的位置是 (300, 200),那么:

  • 局部坐标(50, 30) 是相对于按钮的父控件(窗口)的坐标。
  • 全局坐标:通过 mapToGlobal 转换后,这个点在屏幕上的绝对位置应该是 (300 + 50, 200 + 30) = (350, 230)
3.1.示例代码

以下是一个简单的 Qt 示例:

#include <QApplication>
#include <QPushButton>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;window.setGeometry(300, 200, 400, 300); // 设置窗口的位置和大小QPushButton button("Click Me", &window);button.setGeometry(50, 30, 100, 50); // 设置按钮的位置和大小window.show();// 将按钮的局部坐标 (10, 10) 转换为全局坐标QPoint localPoint(10, 10);QPoint globalPoint = button.mapToGlobal(localPoint);qDebug() << "Local Point:" << localPoint;  // 输出 (10, 10)qDebug() << "Global Point:" << globalPoint; // 输出屏幕上的全局位置return app.exec();
}

运行
在这里插入图片描述

3.2.输出结果

假设窗口的左上角起点是 (300, 200),按钮的位置是 (50, 30),则局部坐标 (10, 10) 对应的全局坐标是:

Local Point: QPoint(10, 10)
Global Point: QPoint(360, 240)

4.和其他方法的区别

Qt 提供了一些相关的方法,用于坐标系之间的转换:

  • mapFromGlobal

  • 将全局坐标转换为控件的局部坐标。

  • 签名:QPoint QWidget::mapFromGlobal(const QPoint &pos) const

  • mapToParent

  • 将控件的局部坐标转换为父控件的坐标。

  • 签名:QPoint QWidget::mapToParent(const QPoint &pos) const

  • mapFromParent

  • 将父控件的坐标转换为控件的局部坐标。

  • 签名:QPoint QWidget::mapFromParent(const QPoint &pos) const

4.1.区别总结:
方法功能说明
mapToGlobal局部坐标 → 全局坐标
mapFromGlobal全局坐标 → 局部坐标
mapToParent局部坐标 → 父控件坐标
mapFromParent父控件坐标 → 局部坐标

5.注意事项

1.嵌套控件的影响

  • 如果控件嵌套在多个层级中,mapToGlobal 会自动递归地将局部坐标转换到屏幕的全局坐标。

2.坐标有效性

  • 如果控件尚未显示在屏幕上(例如窗口未显示),全局坐标可能不准确。

3.高 DPI 支持

  • 在高 DPI 屏幕中,可能需要考虑像素缩放比例(devicePixelRatio),以确保坐标转换的正确性。

6.实际应用场景

mapToGlobal 在 GUI 程序中非常常用,尤其是在以下场景中:

1.显示上下文菜单

  • 在控件的某个局部位置显示上下文菜单时,需要将该位置转换为全局坐标。
QPoint globalPos = button->mapToGlobal(QPoint(0, button->height()));
menu->exec(globalPos); // 在按钮底部显示菜单

2.鼠标事件处理

  • 将鼠标点击的局部坐标转换为全局坐标,以便与其他控件或屏幕交互。

3.窗口定位

  • 将控件的某个局部位置转换为全局坐标,用于精确定位弹出窗口或提示框。

7.总结

mapToGlobal 是 GUI 编程中处理坐标转换的重要工具,能够帮助开发者将局部坐标映射到全局坐标,从而实现精确的界面定位和交互功能。了解它的工作机制以及与其他坐标转换方法的区别,是高效开发 GUI 程序的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫--小白篇【爬取B站视频】

目录 一、任务分析 二、网页分析 三、任务实现 一、任务分析 将B站视频爬取并保存到本地&#xff0c;经过分析可知可以分为四个步骤&#xff0c;分别是&#xff1a; 爬取视频页的网页源代码&#xff1b;提取视频和音频的播放地址&#xff1b;下载并保存视频和音频&#x…

UniScene:Video、LiDAR 和Occupancy全面SOTA

论文: https://arxiv.org/pdf/2412.05435 项目页面&#xff1a;https://arlo0o.github.io/uniscene/ 0. 摘要 生成高保真度、可控制且带有标注的训练数据对于自动驾驶至关重要。现有方法通常直接从粗糙的场景布局生成单一形式的数据&#xff0c;这不仅无法输出多样化下游任务…

Ubuntu22.04搭建FTP服务器保姆级教程

在网络环境中&#xff0c;文件传输是一项至关重要的任务。FTP&#xff08;文件传输协议&#xff09;是一种基于客户端/服务器模式的协议&#xff0c;广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版&#xff0c;因其稳定性和易用性而广受开发者和系统管理员的喜爱…

【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…

React 第十六节 useCallback 使用详解注意事项

useCallback 概述 1、useCallback 是在React 中多次渲染缓存函数的 Hook&#xff0c;返回一个函数的 memoized的值&#xff1b; 2、如果多次传入的依赖项不变&#xff0c;那么多次定义的时候&#xff0c;返回的值是相同的,防止频繁触发更新&#xff1b; 3、多应用在 父组件为函…

二十七、Tomcat专题总结与拓展

文章目录 一、Tomcat设计思路总结1、Tomcat整体架构2、Tomcat设计思路 二、Tomcat源码设计精髓三、拓展&#xff1a;SpringBoot整合Tomcat源码分析四、拓展&#xff1a;SpringBoot整合Undertow实战1、Undertow概述2、SpringBoot集成Undertow2.1、引入依赖2.2、application.prop…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

【JAVA】旅游行业中大数据的使用

一、应用场景 数据采集与整合&#xff1a;全面收集旅游数据&#xff0c;如客流量、游客满意度等&#xff0c;整合形成统一数据集&#xff0c;为后续分析提供便利。 舆情监测与分析&#xff1a;实时监测旅游目的地的舆情信息&#xff0c;运用NLP算法进行智能处理&#xff0c;及…

android studio创建虚拟机注意事项

emulator 启动模拟器的时候&#xff0c;可以用 AVD 界面&#xff0c;也可以用命令行启动&#xff0c;但命令行启 动的时候要注意&#xff0c;系统有两个 emulator.exe &#xff0c;建议使用 emulator 目录下的那个&#xff01;&#xff01; 创建类型为google APIs的虚拟机可从…

全面解析租赁小程序的功能与优势

内容概要 租赁小程序正在逐渐改变人与物之间的互动方式。通过这些小程序&#xff0c;用户不仅可以轻松找到所需的租赁商品&#xff0c;还能够享受无缝的操作体验。为了给大家一个清晰的了解&#xff0c;下面我们将重点介绍几个核心功能。 建议&#xff1a;在选择租赁小程序时&…

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…

用二维图像渲染3D场景视频

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

每日一练:链表-重排链表

LCR 026. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → ……

国产物联网平台(IotSharp+IoTGateway+Influxdb)快速上手

环境说明&#xff1a; Visual Studio 2022 CommunityIotSharp代码&#xff1a;https://github.com/IoTSharp/IoTSharp.gitIoTGateway版本&#xff1a;v2.1.1Node版本&#xff1a;v20.18.1Influxdb版本&#xff1a;v2.7.11 安装Node Node.js官网 官网下载并安装&#xff0c;…

每日一刷——二叉树的构建——12.12

第一题&#xff1a;最大二叉树 题目描述&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 我的想法&#xff1a; 我感觉这个题目最开始大家都能想到的暴力做法就是遍历找到数组中的最大值&#xff0c;然后再遍历一遍&#xff0c;把在它左边的依次找到最大…

Redis篇-6--原理篇5--单线程模型

1、概述 Redis 采用单线程模型来处理客户端请求&#xff0c;这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现&#xff0c;并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的&#xff0c;但它通过高效的内存管理和网络 I/O 操作&#xff0c;仍然能…

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功

项目场景&#xff1a; 使用MAC电脑&#xff0c;以子账号&#xff08;非root&#xff09;的形式登录&#xff0c;连接堡垒机CLB&#xff08;传统型负载均衡&#xff09;&#xff0c;使用FileZilla&#xff08;SFTP&#xff09;进行FTP文件传输。 问题描述&#xff1a; MAC电脑…

Linux下进程替换exec系列接口

文章目录 Linux下进程替换1. c库exec函数族一、exec函数族简介二、exec函数族函数原型及参数说明三、exec函数族的工作机制四、注意事项五、示例代码 2. 系统调用execve接口一、execve接口与C库exec函数族的关系二、函数原型三、参数说明四、工作原理五、返回值六、注意事项七、…

网页爬虫技术全解析:从基础到实战

引言 在当今信息爆炸的时代&#xff0c;互联网上的数据量每天都在以惊人的速度增长。网页爬虫&#xff08;Web Scraping&#xff09;&#xff0c;作为数据采集的重要手段之一&#xff0c;已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…

设计模式:24、访问者模式

目录 0、定义 1、访问者模式的五种角色 2、访问者模式的UML类图 3、示例代码 0、定义 表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下&#xff0c;定义作用于这些元素的新操作。 1、访问者模式的五种角色 抽象元素&#xff08;Element…