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

发布于:2025-02-10 ⋅ 阅读:(60) ⋅ 点赞:(0)

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;
}

网站公告

今日签到

点亮在社区的每一天
去签到