当前位置: 首页 > article >正文

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动


  • 最后更新日期:2025.01.25

下面让我们开始今天的主题…


一、开启篇

请添加图片描述

  • 提出问题:请看上图,我们想要实现的效果是控件黄色的Widge(m_infobarWidget)t随着可视化窗口(m_glWidget )的移动而移动。
  • 基本解决方案:实现的想法很简单,我们在move或者resize的事件的事件中调用黄色Widget的move函数就实现同步移动。

那么,我开始根据上面的想法,直觉的写出了以下代码:

bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
    if (event->type() == QEvent::Resize || event->type() == QEvent::Move) {
        if (m_glWidget && m_infobarWidget) {
            auto glPos = m_glWidget->pos();
            m_infobarWidget->move(glPos);
        }
    }
    return false;
}

但是效果呢?
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3dd1d1f77a614179a51d0015a17d51d1.pn
我是tm,在这里试了好多次,都哭了>-_-<,哈哈,开玩笑的,反正在这里搞了好久。
最后,查询手册,发现QMidget及其之类的move()函数传入的参数坐标是基于父类的位置,也就是说比如:

m_infobarWidget->move(QPoint(1,1));

那么,m_infobarWidget的位置是基于他父类的左上角向右边和下边移动1。所以为了计算m_infobarWidget在其父类的相对值,我们首先需要获取m_glWidget在全局的位置

//这里获取m_glWidget的(0,0)点映射到全局的坐标
auto globPos =m_glWidget->mapToGlobal(QPoint(0, 0));

然后,需要将全局坐标点映射到m_infobarWidget父类的相对值。

//这里m_infobarWidget是MainWindow的成员函数,这里将全局坐标转换为父类下的相对坐标
auto relaPos=mapFromGlobal(globPos);

下面是完整代码:

bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
    if (event->type() == QEvent::Resize || event->type() == QEvent::Move) {
        // 将infobar移动到opengl窗口的定定位点。
        if (m_glWidget && m_infobarWidget) {
            // 拿到m_glWidget局部坐标为(0,0)在全局的坐标
            auto globPos = m_glWidget->mapToGlobal(QPoint(0, 0));
            // 获取全局坐标在MainWindow下的局部坐标
            m_infobarWidget->move(mapFromGlobal(globPos));
        }
    }
    return false;
}

http://www.kler.cn/a/521255.html

相关文章:

  • SQL 指南
  • LeetCode - Google 大模型校招10题 第1天 Attention 汇总 (3题)
  • Java后端之AOP
  • 深入 Rollup:从入门到精通(三)Rollup CLI命令行实战
  • linux设置mysql远程连接
  • GPT 本地运行输出界面简洁美观(命令行、界面、网页)
  • 基于Flask的旅游系统的设计与实现
  • jupyter版本所引起的扩展插件问题
  • 数组与链表
  • java知识点 | java中不同数据结构的长度计算
  • Jetson nano 安装 PCL 指南
  • 【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM
  • 【第八天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的回溯算法(持续更新)
  • unity. Capsule Collider(胶囊碰撞体)
  • 什么是反向海淘?如何入局反向海淘?
  • 关于圆周率的新认知
  • 寒假学web--day08
  • 第26章 测试驱动开发(TDD)模式详解与 Python 实践
  • K8s运维管理平台 - xkube体验:功能较多
  • [HOT 100] 0015. 三数之和