网站主流系统,临沂建设局网站质量三监督,找资源,中国建设银行网站股份结构变化Qt中Widget及其子类的相对位置移动 最后更新日期#xff1a;2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题#xff1a;请看上图#xff0c;我们想要实现的效果是控件黄色的Widge#xff08;m_infobarWidget#xff09;t随着可视化窗口#xff08;m_glWidge…Qt中Widget及其子类的相对位置移动 最后更新日期2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题请看上图我们想要实现的效果是控件黄色的Widgem_infobarWidgett随着可视化窗口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;
}但是效果呢 我是tm在这里试了好多次都哭了-_-哈哈开玩笑的反正在这里搞了好久。 最后查询手册发现QMidget及其之类的move()函数传入的参数坐标是基于父类的位置也就是说比如:
m_infobarWidget-move(QPoint(1,1));那么m_infobarWidget的位置是基于他父类的左上角向右边和下边移动1。所以为了计算m_infobarWidget在其父类的相对值我们首先需要获取m_glWidget在全局的位置
//这里获取m_glWidget的00点映射到全局的坐标
auto globPos m_glWidget-mapToGlobal(QPoint(0, 0));然后需要将全局坐标点映射到m_infobarWidget父类的相对值。
//这里m_infobarWidget是MainWindow的成员函数这里将全局坐标转换为父类下的相对坐标
auto relaPosmapFromGlobal(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局部坐标为00在全局的坐标auto globPos m_glWidget-mapToGlobal(QPoint(0, 0));// 获取全局坐标在MainWindow下的局部坐标m_infobarWidget-move(mapFromGlobal(globPos));}}return false;
}