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 程序的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++核心day3作业

作业&#xff1a; 1.整理思维导图 2.整理课上代码 3.把课上类的三个练习题的构造函数写出来 函数全部类内声明&#xff0c;类外定义 定义一个矩形类Rec&#xff0c;包含私有属性length、width&#xff0c;包含公有成员方法&#xff1a; void set_length(int l); //设置长度v…

基于Spring Boot库存管理系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 基于Spring Boot库存管理系统 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c…

FPGA 17 ,FPGA 与 SR-IOV虚拟化技术,高性能计算与虚拟化技术的结合(FPGA 与 SR-IOV 和 PCI,高性能计算与虚拟化的完美融合)

目录 前言 一. SR-IOV 的起源与发展 1. SR-IOV 的起源与时间线 2. SR-IOV 的诞生原因 3. SR-IOV 的详细介绍 二. SR-IOV 和 PCI 之间的关系 三. PCI 的起源与演进 1. PCI 的起源与时间线 2. PCI 的关键特性 四. FPGA 的独特魅力 1. FPGA 的定义与特性 2. FPGA 的内…

【深度学习】深刻理解Masked Autoencoders(MAE)

Masked Autoencoders (MAE) 是近年来自监督学习领域中的一项重要创新&#xff0c;尤其在计算机视觉领域取得了显著进展。随着深度学习的快速发展&#xff0c;自监督学习逐渐成为了一种重要的无监督学习方法&#xff0c;它通过从数据中学习表示而不依赖人工标签&#xff0c;极大…

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展

向Oracle 19g数据库中批量插入数据&#xff0c;当插入近2亿条数据后&#xff0c;报出如下错误&#xff1a; ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间&#xff0c;发现表空间大小已达到32G&#xff0c;表空间无法进行自动扩展了。&#xff08;初始…

图的遍历(C++实现图【2】)

目录 1. 图的遍历 1.1 图的广度优先遍历 2.2 图的深度优先遍历 1. 图的遍历 给定一个图G和其中任意一个顶点v0&#xff0c;从v0出发&#xff0c;沿着图中各边访问图中的所有顶点&#xff0c;且每个顶点仅被遍历一次。"遍历"即对结点进行某种操作的意思。 1.1 图的广度…

群控系统服务端开发模式-应用开发-邮件发送工具类

一、邮件发送工具类开发 1、添加框架对应的SDK composer require phpmailer/phpmailer 2、添加工具集 在根目录下extend文件夹下创建Email文件夹&#xff0c;在Email文件夹下添加工具集控制并命名为EmailSender.php <?php /*** 邮件发送工具* User: 龙哥三年风水* Date: …

如何在vue中使用ECharts

一. 打开ECharts官网,点击快速入门 下面是ECharts官网的链接 https://echarts.apache.org/ 二.在vue中使用 1.首先先引入Echarts js文件 如下图&#xff0c;下面的第一张图片是官网的实现&#xff0c;第二章图片是我根据官网的实现 2.给ECharts 创建一个DOM容器 3. 使用ec…

Java版-图论-拓扑排序与有向无环图

拓扑排序 拓扑排序说明 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列…

Nginx安装和配置详解

1.Nginx的安装 1.1运行以下脚本安装 yum install yum-utils -y rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm# 查看所有可安装nginx版本 yum --showduplicates list available nginx yum install nginx-1.24.0 -y …

Pytest测试框架

Pytest测试框架 测试用例发现规则 默认从当前或者指定文件夹下递归查找文件名以test_开头或者_test结尾的.py文件以Test 开头且&#xff08;不继承自 unittest.TestCase或者含有init方法的类&#xff09;的类函数名以 test_ 开头的测试用例方法 自定义测试用例发现规则 我们…

【OpenCV】图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

idea压缩js,css

这是需要的jar包(文章顶部也可以下载) 地址:https://download.csdn.net/download/yuzheh521/90109966?spm1001.2101.3001.9500 压缩js arguments: -jar E:\swj\jar_packages\css_js_compress\yuicompressor-2.4.8.jar --type js --charset utf-8 $FilePath$ -o $FileNameWith…

css基础记录

基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…

【C++】LeetCode:LCR 078. 合并 K 个升序链表

题干&#xff1a; 给定一个链表数组&#xff0c;每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解法&#xff1a;优先队列 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *ne…

使用PHPUnit使用本地调试代替远程调试,快速提高开发效率

Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架&#xff0c;但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代&#xff0c;AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水&#xff1f;每款AI都有其独特的魅力与优势&#xff0c;那么&#xff0c;究竟哪一款AI聊天助手最适合你呢&#xff1f;本文将带…

Spring Boot 性能提升的核武器,速度提升 500%!

虚拟线程是 Java 21 引入的一个新特性&#xff0c;用于简化并发编程。它与传统的操作系统线程相比&#xff0c;具有显著的优势&#xff1a; 轻量级&#xff1a;虚拟线程由 JVM 管理&#xff0c;而非操作系统&#xff0c;因此它们的内存占用和创建成本远低于传统线程。理论上&am…

Ubuntu下的gpt-sovits学习记录1:安装与测试

GitCode - 全球开发者的开源社区,开源代码托管平台 国内镜像点。 下载压包&#xff1a; 解压到没有中文名的文件夹内。如我 1.创建虚拟环境 conda create -n GPTSoVits python3.9 2.新建工程 3.部分环境 pip install -r requirements.txt 4.模型下载。建议直接下载上边的…

二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)

双分支节点个数 假设二叉树采用二叉链表存储结构存储&#xff0c;试设计一个算法&#xff0c;计算一棵给定二叉树的所有双分支节点个数 算法思想 计算一棵二叉树中所有双分支节点个数的递归模型 若树为空&#xff0c;结果为0 若当前节点为双分支节点&#xff0c;递归左右孩子…