调整大小时 QGraphicsView 中项目位置的边距

Posted

技术标签:

【中文标题】调整大小时 QGraphicsView 中项目位置的边距【英文标题】:margin of item position in QGraphicsView while resizing 【发布时间】:2016-09-30 09:53:26 【问题描述】:

我正在使用图形视图框架将运行时的项目添加到视图中。项目将像垂直布局一样放置在另一个下方。

我总是将我的项目放在场景的开始位置 (10,10) 。但是在调整视图大小时,边距正在调整。每次调整视图窗口大小时如何保持相同的边距?

我用谷歌搜索发现

QTransform Matrix(1, 0, 0, 0, 1, 0, 0, 0, 1);
Matrix.scale(width() / sceneRect().width(), height() / sceneRect().height())
setTransform(Matrix);

有助于恢复边距,但它也会根据视图高度比率缩小项目。

即使视图小部件缩小或扩大,我也一直希望保持相同的项目大小。滚动条必须出现。

【问题讨论】:

【参考方案1】:

QGraphicsView 是一个场景的视口。你提到在视图中添加东西,这不是你在做什么;您将它们添加到场景中,然后视图将它们可视化。可能你已经明白了,但要清楚。

我认为您想要做的是,当您调整视图大小时,您希望像素与场景的关系保持不变,并且您希望视图的原点“坚持”到场景的原点。您提到了边距,但场景/视图关系中没有内置这样的东西,所以这是您必须自己维护的东西。换句话说,您只需不放置任何项目就可以在场景中创建一个边距,然后您必须平移视图以使场景中的边距区域始终位于视图的视口内。这是我认为您遇到问题的第二部分。

我的建议是在调整视图大小时检查视图的转换矩阵。 m11 和 m22 值是显示视图像素如何映射到场景坐标上的缩放因子,dx 和 dy 是显示视图原点和场景原点之间关系的平移因子。

【讨论】:

感谢您的明确答复。是的,我只是将项目添加到场景中。假设场景坐标为 (0,0,1000,1000) ,我将项目放置在 QPoint(18,12) 以保持边距差距。但是当我调整视图窗口的大小时,这些边距正在增加。我添加的代码行将有助于保持边距,但也可以缩放项目,但我必须忽略项目收缩。 我必须自己编写代码才能绝对确定,但是如果您检查这些转换矩阵值,我想您会发现您希望比例因子(m11 和 m22)保持与调整视图大小相同。我认为您需要继承 QGraphicsView 并覆盖 resizeEvent 并在其中重置 QGraphicsView 比例因子。 我一定会做到的。非常感谢你。我会根据您的建议更新并在这里回复您。

以上是关于调整大小时 QGraphicsView 中项目位置的边距的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QGraphicsView::Scale 之后调整 QGraphicsView 的大小

调整 QGraphicsScene 大小时的事件

如何用鼠标动态调整 QHBoxLayout 和 QGraphicsView 大小? (Python,Pyqt4)

QGraphicsView 滚动条策略未按预期工作

在 QGraphicsView 中移动项目

Extjs - 当Compositefield中的项目增长/调整大小时如何调整兄弟姐妹的位置