You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让QWidget适配QGraphicsScene?停靠部件Resize时保持同尺寸

让QWidget与QGraphicsScene随Dock Widget同步调整大小的解决方案

你已经把QWidget通过QGraphicsProxyWidget嵌入到QGraphicsScene里了,但dock widget调整大小时,widget和scene没法跟着一起缩放的问题,我给你梳理下需要调整的几个关键点:

1. 让QGraphicsView占满Dock的空间

首先得确保你的QGraphicsView能自动填充dock widget的布局空间,不然view本身都不跟着dock缩放,后面的scene和widget自然也不会变。给view设置合适的尺寸策略:

view1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

同时把view的对齐方式设为左上角,避免widget在view里居中显示:

view1->setAlignment(Qt::AlignLeft | Qt::AlignTop);

2. 让QGraphicsScene跟随View视口大小变化

默认情况下scene不会自动跟着view的视口缩放,所以我们需要监听view视口的resize事件,同步更新scene的范围:

// 关联视口的resize信号,更新scene的矩形
connect(view1->viewport(), &QWidget::resize, this, [this]() {
    QRect viewRect = view1->viewport()->rect();
    scene1->setSceneRect(QRectF(viewRect));
});

3. 让Proxy Widget占满整个Scene空间

最后一步,要让嵌入的widget通过proxy占满整个scene的范围,这样scene缩放时widget也会跟着铺满:

// 设置proxy的尺寸策略为可扩展
pwig->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// 初始化时同步一次大小
pwig->setGeometry(scene1->sceneRect());
// 监听scene矩形变化,同步proxy的大小
connect(scene1, &QGraphicsScene::sceneRectChanged, this, [pwig](const QRectF& newRect) {
    pwig->setGeometry(newRect);
});

把这些代码加到你现有逻辑的后面,就能实现dock widget调整大小时,QWidget、QGraphicsScene和QGraphicsView三者同步缩放的效果了。

内容的提问来源于stack exchange,提问作者pazduha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:18:32