手动调整窗口大小后,QGraphicsScene 宽度/高度没有变化

Posted

技术标签:

【中文标题】手动调整窗口大小后,QGraphicsScene 宽度/高度没有变化【英文标题】:QGraphicsScene width/height is not changing after the window was resized manually 【发布时间】:2018-03-15 15:35:48 【问题描述】:

我有一个由图形视图和图形场景组成的应用程序。基本的 GUI 结构是这样的(在 Qt Creator 中完成):

QMainWindow
  QWidget (centralWidget)
    QGridLayout
      QVBoxLayout
      QGraphicsView

这是我的主窗口构造函数代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),

    ui->setupUi(this);

    scene = new Scene(this);
    ui->graphicsView->setScene(scene);
    scene->setSceneRect(-100,-100,200,200);

现在,当我手动调整应用程序窗口的大小时,场景/图形视图在视觉上也会调整大小。它在所有可见区域也很活跃,我可以捕捉鼠标事件,在那里添加项目,尽管它超出了setSceneRect() 设置的区域。但是当我调用scene->width()scene->height() 时,它总是返回200。如何获取场景可见部分的大小而不是 setSceneRect() 中设置的大小?场景的可见部分是指我的项目可视化的白色可见区域/矩形,如果项目超出该区域,则不可见。

【问题讨论】:

看来这就是我要找的东西:graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect(),以防万一有人需要。 当您有时间时,请发表您的评论作为您自己问题的答案。 【参考方案1】:

一般根本不需要设置场景矩形,除非场景有很多项目。当您可以比itemsBoundingRect() 更快地计算场景内容的边界矩形时,或者如果您知道场景的固定最大大小,则设置它是一种优化 - 例如如果场景代表一些固定大小的画布。否则,您别无选择,只能将其置之不理。

无论如何,将场景矩形绑定到视口是不正确的。场景矩形由空间索引使用,并且必须代表场景的内容,与任何视口无关。回想一下,场景是一个可以单独使用的模型——它可以有 0 个或多个视口附加到它上面。将任何特定视口强绑定到任何场景参数都是设计错误。

【讨论】:

感谢您的回答。我不得不设置场景矩形(或者至少没有找到任何其他解决方案)。问题是我有几个小图形项目在场景中移动。如果其中一个过于靠近场景可见部分的边界,则整个场景都会移动,因此该项目不再靠近边界,但其坐标保持不变,只有场景本身与所有项目在一起感动。我用setSceneRect() 修复了它。对于另一部分,如果我在评论中的解决方案是错误的,我应该如何获得场景中这个可见部分的大小? 可以在视图中设置场景的对齐方式;例如您希望将左上角映射到视口和场景之间的同一点。然后什么都不会动。 感谢您的建议,但设置对齐方式仍有一些问题。添加第一个项目时场景移动,然后就可以了。但这可能是关于如何正确设置对齐并防止上述问题的另一个问题。

以上是关于手动调整窗口大小后,QGraphicsScene 宽度/高度没有变化的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem:如何在 QGraphicsScene 调整大小时自动移动它?

我的 JComponent 的内容仅在手动调整大小后刷新

缩放 QGraphicsScene 以填充整个 QGraphicsView

JavaScript/JQuery: $(window).resize 调整大小完成后如何触发?

kmplayer播放器,如何调整窗口大小

在 QGraphicScene 中动态调整视频大小