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

news2025/1/9 16:49:17

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.coloradmin.cn/o/2257167.html

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

相关文章

使用Kimi开发自己的问答应用

概述 Kimi是大家常用的一个人工智能助手&#xff0c;本文使用Kimi开发文档&#xff0c;以node作为后端&#xff0c;开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手&#xff0c;擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页&#xff1a;chian-ocean 文章专栏 前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的编译器集合&#xff0c;支持多种语言&#xff0c;包括 C 和 C。其中 gcc 用于 C 语言编译&#xff0c;g 专用于 C 编译。 Linux GCC or G的安…

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&#xff0c;性能优化是…

Flask 是什么?

近期开发chatbot 程序&#xff0c;过程中要使用Flask&#xff0c;所以收集资料记录这个套件的信息&#xff1a; Flask 是什么&#xff1f; Flask 是一个轻量级、模块化的 Python Web 框架&#xff0c;用于构建 Web 应用程序和 API。它被设计为简单、灵活且可扩展&#xff0c;…

北京大学《操作系统原理》(陈向群主讲)课堂笔记(一)

北京大学《操作系统原理》&#xff08;陈向群主讲&#xff09;课堂笔记&#xff08;一&#xff09; 一、操作系统概述 1.1、操作系统做了什么&#xff1f; 以c语言helloworld为例子&#xff1a; #include<stdio.h> int main(int argc, char *argv[]) {puts("hello…

计算c++11 lambada表达式的大小

lambada表达式是什么? 详解&#xff1a;lambada表达式详解 我们知道lambada其实是一个匿名函数 &#xff0c; 它属于 可调用对象 类型。在 C 中&#xff0c;lambda 表达式会生成一个隐式定义的类&#xff0c;这个类重载了 operator()&#xff0c;使得该对象可以像函数一样被…

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…

亚马逊云科技 re:Invent 2024!Amazon Aurora DSQL 闪亮登场,跨区域提供强一致性,带来全新突破!

在 AWS re:Invent 2024 的主题演讲中&#xff0c;Amazon 正式发布了支持多区域 Active/Active 架构的关系型数据库 Aurora DSQL&#xff0c;目前已开放预览。 我正在拉斯维加斯现场观看 Keynote&#xff0c;刚刚听到这一令人振奋的消息。Aurora DSQL 的亮点在于能够跨区域写入…

计算机视觉在科学研究(数字化)中的实际应用

计算机视觉是一种利用计算机技术来解析和理解图像和视频的方法。.随着计算机技术的不断发展&#xff0c;计算机视觉被广泛应用于科学研究领域&#xff0c;为科学家提供了无限的可能。 一、生命科学领域 在生命科学领域&#xff0c;计算机视觉被广泛用于图像识别、分类和测量等…

Springboot美食分享平台

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 Springboot美食分享平台 一、 绪论 1.1 研究意义 当今社会作为一个飞速的发展社会&#xff0c;网络已经完全渗入人们的生活&#xff0c; 网络信息已成为传播的第一大媒介&#xff0c; 可以毫不夸张说…

如何在组织中塑造和强化绩效文化?

在组织中塑造和强化绩效文化是一个系统性的工程。 一、明确绩效目标与期望 设定清晰目标 组织应根据自身战略规划&#xff0c;将长期目标分解为具体、可衡量、可实现、相关联、有时限&#xff08;SMART&#xff09;的短期和中期绩效目标。例如&#xff0c;一家连锁餐饮企业的…

WireShark 下载、安装和使用

1、下载 官网下载太慢&#xff0c;本人另外提供下载地址【下载WireShark】 2、安装 全部默认下一步即可&#xff0c;但如下图所示的这一步值得拿出来说一下。这一步是要你安装Npcap&#xff0c;但是你的电脑如果已经安装了WinPcap&#xff0c;那么可以选择不再安装Npcap。Npca…

RocketMq详解:六、RocketMq的负载均衡机制

上一章&#xff1a;《SpringBootAop实现RocketMq的幂等》 文章目录 1.背景1.1 什么是负载均衡1.2 负载均衡的意义 2.RocketMQ消息消费2.1 消息的流转过程2.2 Consumer消费消息的流程 3.RocketMq的负载均衡策略3.1 Broker负载均衡3.2 Producer发送消息负载均衡3.3 消费端的负载均…

期末复习-Hadoop综合复习

说明 以下内容仅供参考&#xff0c;提到不代表考到&#xff0c;请结合实际情况自己复习 目录 说明 一、题型及分值 二、综合案例题-部署Hadoop集群 或 部署Hadoop HA集群 案例 1&#xff1a;Hadoop 基础集群部署 案例 2&#xff1a;Hadoop HA 集群部署 案例 3&#xff…

民宿管理系统

目录 如需链接的小伙伴pc端请点击&#x1f449;&#x1f449;&#x1f449;资源 移动端请点击&#x1f449;&#x1f449;&#x1f449;请点击 1 系统简介 2 系统相关技术 2.1 Java技术 2.2 SSM框架 2.3 MySQL数据库 3 需求分析 3.1 系统介绍 3.1.1 系统概述 3.1.2 系…

Vue Web开发(二)

1. 项目搭建 1.1. 首页架子搭建 使用Element ui中的Container布局容器&#xff0c;选择倒数第二个样式&#xff0c;将代码复制到Home.vue。 1.1.1.下载less &#xff08;1&#xff09;下载less样式 npm i less   &#xff08;2&#xff09;下载less编辑解析器 npm i less…

专业135+总分400+华中科技大学824信号与系统考研经验华科电子信息与通信工程,真题,大纲,参考书。

考研成功逆袭985&#xff0c;上岸华科电子信息&#xff0c;初试专业课824信号与系统135&#xff0c;总分400&#xff0c;成绩还是很满意&#xff0c;但是也有很多遗憾&#xff0c;总结一下自己的复习&#xff0c;对于大家复习给些参考借鉴&#xff0c;对自己考研画个句号&#…

解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾

在数字化时代&#xff0c;开源已成为推动技术创新和知识共享的核心力量&#xff0c;尤其在数据领域&#xff0c;开源技术的涌现不仅促进了行业的快速发展&#xff0c;也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用&#xff0c;时序数据库…

Android自定义验证码输入框

Android自定义验证码输入框 Android开发的验证码输入框&#xff0c;输入够自动触发下一步 一、思路&#xff1a; 自定义验证码控件&#xff0c;监听每一个输入框 二、效果图&#xff1a; 看视频更直观点&#xff1a; Android开发轮子-自定义验证码输入框 三、关键代码&…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…