在 QGraphicsGridLayout 中调整小部件大小

Adjusting widget size in QGraphicsGridLayout

我正在尝试使用自定义 QGraphicsWidgets 在 QGraphicsView 和 QGraphicsScene 上制作网格,但我不确定最好的方法是什么。我正在使用 PyQt4,但这是一个常见的 Qt 问题。

我当前的实现包含以下内容。一个 QGraphicsScene(带视图)和一个 QGraphicsWidget,其中包含我插入自定义小部件的 QGraphicsGridLayout。

我遇到的问题是这些自定义小部件中的每一个都有不同的大小,并且它们重叠,我不确定我将如何分别更改每个小部件的大小。此外,网格需要 "responsive" 即,如果小部件有一定宽度,则应有 3 列,但如果小部件较小,则应仅显示 2 列。

我读到这可能可以通过实施大小提示来解决,但我还没有真正找到关于该主题的任何好的文档。

所以我的问题是:

  1. 有没有更好的widget层次化的方法,我现在的好像有点过分(Scene > Widget > Layout > Widgets)
  2. 使不同大小的小部件具有相同大小的最佳方法是什么(这样它们在网格中的大小都相同并且不会重叠)?
  3. 我的主要 QGraphicsWidget(在其上显示网格)没有占据整个视图的宽度,实现这一点的最佳方法是什么?
  4. 我将如何制作我的 QGraphicsGrid "responsive"?
  1. Is there a better way to make the hierarchy of widgets, my current one seems excessive (Scene > Widget > Layout > Widgets)

当我使用QGraphics....类时,我一般会子类化QGraphicsView。该视图将创建它自己的场景,并具有创建所有子项的便捷方法。从 api 的角度来看,只有视图小部件才真正公开。

  1. What's the best way to make different sized widgets the same size (so they would all appear the same size in the grid and not overlap)?

这取决于它们是什么类型的小部件。如果它们是 images/pixmaps,您可以将它们缩放到特定大小。如果它们是带有控件的实际小部件,您可能不想缩放它们,而应该使用 setGeometry 设置它们的实际 height/width。否则,所有 QGraphicsItem 都支持缩放。

  1. My main QGraphicsWidget (on which the grid is displayed) doesn't take up the whole width of the view, what is the best way to achieve this?

在视图上,您​​可以获得 .viewport() 大小,然后只需将图形小部件的大小设置为视口的大小即可。您必须覆盖 QGraphicsView 上的 resizeEvent,以便在视图调整大小时也调整 QGraphicsWidgets 的大小。

  1. How would I go about making my QGraphicsGrid "responsive"?

为此,您最好不要使用网格并手动计算每个项目在图形场景中的位置。这在某种程度上取决于您希望如何放置物品。某些小部件是否应该位于其他小部件下方或旁边?你只想要一个紧凑的网格吗?一个项目可以跨越两条网格线吗?是否所有内容都必须适合单个 "page",或者是否允许垂直滚动。在你得到任何好的答案之前,你必须先回答这些问题。但通常,您知道视口的大小。如果您有一个图形项目列表,您可以遍历它们并根据您已经放置的项目设置它们的位置。再次覆盖图形视图上的 resizeEvent,以便您可以在视图调整大小时重新计算项目位置。