如何在QWidget父控件内按相对坐标添加子QWidget并保持相对位置
注意:本文中提及的父、子指的是QWidget嵌套关系,而非类继承关系。
实现方案
Qt 原生的控件嵌套机制天然支持该需求,可根据parent控件是否配置布局选择对应方案:
方案1:parent 未设置布局(最简方案)
直接将child的父控件设置为parent即可,此时child的坐标体系默认相对于parent的内容区域左上角,parent移动时child会自动跟随,无需额外编写同步逻辑。
示例代码(C++):
// 绑定嵌套父子关系 child->setParent(parent); // 设置child相对于parent左上角的坐标,示例为x轴偏移20px,y轴偏移30px child->move(20, 30); child->show();
示例代码(PyQt/PySide):
# 绑定嵌套父子关系 child.setParent(parent) # 设置child相对于parent左上角的坐标,示例为x轴偏移20px,y轴偏移30px child.move(20, 30) child.show()
如果需要child超出parent区域的部分自动裁剪,给parent添加属性即可:
parent->setAttribute(Qt::WA_ClipChildren, true);
方案2:parent 已有布局
如果parent本身已经配置了布局,直接设置父控件会被布局规则挤压,可选择以下两种方式实现:
- 方式一:在
parent的布局最上层添加一个无布局的透明QWidget作为悬浮层,让悬浮层铺满整个parent,再将child的父控件设置为该悬浮层,之后调用move设置相对坐标即可。 - 方式二:通过事件监听手动同步位置:
- 提前记录
child相对于parent的固定偏移量offsetX、offsetY - 给
parent安装事件过滤器,捕获QEvent::Move事件 - 事件触发时,用
parent的全局坐标加上偏移量,赋值给child作为新位置即可
- 提前记录
内容的提问来源于stack exchange,提问作者Colin Davis
相关产品推荐
相关产品推荐

