我正在尝试使用自定义QGraphicsWidgets在QGraphicsView和QGraphicsScene上制作网格,但我不确定如何做到这一点的最佳方法。我正在使用PyQt4,但这是一个普遍的Qt问题。
我当前的实现包含以下内容。一个QGraphicsScene(带有视图)和一个QGraphicsWidget,它包含我插入自定义小部件的QGraphicsGridLayout。
我遇到的问题是这些自定义小部件中的每一个都有不同的大小,并且它们重叠,我不确定如何分别更改每个小部件的大小。此外,网格需要“响应”,即如果窗口小部件是某个宽度,那么应该有3列,但如果窗口小部件更小,则只显示2列。
我读过这可能是通过实现大小提示来解决的,但我还没有找到关于该主题的任何好的文档。
所以我的问题是:
答案 0 :(得分:1)
- 是否有更好的方法来制作小部件的层次结构,我当前的小部件似乎过多(场景>小部件>布局>小部件)
醇>
当我使用QGraphics....
类时,我通常将子类QGraphicsView
。视图将创建自己的场景,并具有创建所有子项的便捷方法。从api的角度来看,只有视图小部件才真正暴露出来。
- 使不同大小的小部件具有相同大小的最佳方法是什么(因此它们在网格中显示的大小相同而不重叠)?
醇>
这取决于它们是什么类型的小部件。如果它们是图像/像素图,您可以将它们缩放到一定的大小。如果它们是带控件的实际小部件,您可能不想缩放它们,只需使用setGeometry
设置它们的实际高度/宽度。否则,所有QGraphicsItem
都支持缩放。
- 我的主要QGraphicsWidget(显示网格)不占用视图的整个宽度,实现此目的的最佳方法是什么?
醇>
在视图上,您可以获得.viewport()
大小,然后只需将图形小部件的大小设置为视口大小即可。您必须覆盖resizeEvent
上的QGraphicsView
,以便在视图调整大小时调整QGraphicsWidgets
的大小。
- 我如何让我的QGraphicsGrid“响应”?
醇>
为此,您可能最好不要使用网格并手动计算图形场景中每个项目的位置。这在某种程度上取决于您希望如何放置物品。是否有些小部件应该低于或低于其他小部件?你想要一个紧凑的网格吗?项目可以跨越两个网格线吗?一切都必须适合单个“页面”,或允许垂直滚动。在获得任何好的答案之前,您必须先回答这些问题。但通常,您知道视口的大小。如果你有一个图形项目列表,你可以迭代它们并根据你已经放置的项目设置它们的位置。再次,覆盖图形视图上的resizeEvent
,以便在视图调整大小时重新计算项目位置。