欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > Qt中Widget及其子类的相对位置移动

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

2025/1/31 18:12:51 来源:https://blog.csdn.net/weixin_43470971/article/details/145354982  浏览:    关键词: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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com