如何让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
相关产品推荐
相关产品推荐

