Qt4 调整QGraphicsView的大小';不要移动小部件

Qt4 调整QGraphicsView的大小';不要移动小部件,qt4,qgraphicsview,qgraphicsscene,Qt4,Qgraphicsview,Qgraphicsscene,我有一个QMainWindows,里面有一个QGraphicsView,它占据了所有的客户端区域。在视图中,我渲染了一些QGraphicsTextItem项。只要我不调整主窗口的大小,一切都可以正常工作。如果我这样做,物品会停留在原来的位置,不会移动到新的正确位置。基本上,我要做的是在布局小部件中有一个类似的行为,如果需要可以扩展 更新1 更新2 更新3 使用以下代码,按钮位于客户区的右侧。944是QGraphicsView的Qt设计器定义的宽度。我在该区域的左侧有相同的小部件代码,从10开始

我有一个QMainWindows,里面有一个QGraphicsView,它占据了所有的客户端区域。在视图中,我渲染了一些QGraphicsTextItem项。只要我不调整主窗口的大小,一切都可以正常工作。如果我这样做,物品会停留在原来的位置,不会移动到新的正确位置。基本上,我要做的是在布局小部件中有一个类似的行为,如果需要可以扩展

更新1

更新2

更新3

使用以下代码,按钮位于客户区的右侧。944是QGraphicsView的Qt设计器定义的宽度。我在该区域的左侧有相同的小部件代码,从10开始xPos,每次添加新按钮时递增。如果我调整窗口的大小,左边的小部件总是移动到新的位置,右边的小部件就不会有相同的行为。为什么?

this->ui.setupUi(this);

qreal xPos = 944 - 10;

QGraphicsTextItem *myButton1 = new QGraphicsTextItem("my text");

myButton1 ->adjustSize();
myButton1 ->setPos(xPos - myButton1 ->textWidth(), 10);

xPos -= myButton1 ->textWidth();

this->m_graphicsScene->addItem(myButton1);


QGraphicsTextItem *myButton2 = new QGraphicsTextItem("my text 2");

myButton2 ->adjustSize();
myButton2 ->setPos(xPos - myButton2->textWidth(), 10);

xPos -= myButton2 ->textWidth();

this->m_graphicsScene->addItem(myButton2);

QGraphicsView与场景中的QGraphicsItem对象没有直接连接。它的唯一用途是在视口中可视化场景的一部分,并将用户交互传输到场景。没有布局,但是添加了布局以与QGraphicsWidget一起使用(但这是一个特殊的需求案例)。无论如何,这只是与视图的平移有关,而与场景中项目的位置相反(彼此完全无关)

您最可能需要做的是子类QGraphicsView,并在视图中重新实现resizeEvent:
在resizeEvent中,您将根据调整大小来转换视图:

实际上,您正在自定义QGraphicsView中创建自己的布局管理器功能

更新

我明白你的意思,当Scene竖立视图大于QGraphicsView时,它将使用滚动条,而不会使视图以resize为中心。理想情况下,如果要创建内容不需要滚动的图形场景类型,则应保留场景的默认设置,或将其设置为视口的大小

否则,下面是如何使用resizeEvent的一个非常基本的示例。这是PyQt,但我相信您可以翻译:

class Dialog(QtGui.QDialog):

    def __init__(self):
        super(Dialog, self).__init__()
        self.resize(640,480)
        layout = QtGui.QVBoxLayout(self)

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(-500,-500,1000,1000)
        self.view = GraphicsView(self)
        self.view.setScene(self.scene)
        layout.addWidget(self.view)

        text = self.scene.addText("Foo")

        self.view.updateCenter()


class GraphicsView(QtGui.QGraphicsView):

    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self._center = None

    def resizeEvent(self, event):
        super(GraphicsView, self).resizeEvent(event)
        if self._center:
            self.centerOn(self._center)

    def updateCenter(self):
        center = self.geometry().center()
        self._center = self.mapToScene(center)
当您调用
updateCenter()
时,它会保存您感兴趣的场景点。然后,每次视图调整大小时,它都会回到该场景点的中心

更新2:图片发布和更新后

如果您真的需要在QGraphicscene中使用布局的这种正常QWidget行为,那么您应该看看QGraphicsWidgets,它确实支持布局。然后,您可以制作一个大型根“canvas”小部件,并在布局内部将其他所有内容都制作成该小部件的子部件。然后,您只需要担心保持根小部件的适当大小。然后,您将能够使用上面相同的示例来管理根小部件的大小和位置

有关更多详细信息,请参阅此问题,因为有人希望将QGraphicsItem集成到布局中的情况与此相同:

你能给我写一个小例子说明如何实现翻译功能吗?在此之后,我将接受你的邀请answer@Stefano:您使用的是什么版本的Qt?实际上,我去做了一个示例,并意识到视图的默认行为是保持相对位置。也就是说,如果我在场景的中心创建一个文本项,并调整视图的大小,则随着视图的增长,它将保持在中心。我认为您需要发布一个非常简短的工作示例来说明问题所在。这正是问题所在。我在windows上使用Qt4.8。例如,我将QGraphicsTextItem放置在位置0100处。之后,我调整窗口大小:如果窗口变大,项目应该移动并保持不变的位置,但在我的情况下,它很简单nothing@Stefano:此行为仅在场景大于视图时发生。如果您将场景矩形设置为与视图相同的大小(或者根本不设置),它将使所有内容都居中。我想我对我的问题解释得不好。我不希望窗口小部件停留在中间,我希望当我调整窗口大小时,窗口小部件遵循宽度/高度,因此,如果它们在调整大小后位于左上角,它们必须仍然位于左上角。这种情况不会发生,它们停留在一个固定的位置。不清楚到底应该发生什么。显示器应该缩放吗?如果发生一些神奇的“重新调整”,即居中的项目需要保持居中,但保持其几何图形?如屏幕截图所示,客户区右侧有一些东西。如果我调整窗口的大小,东西不会向右移动,而是保持在原来的位置。视图中的其他东西呢?我猜你不想把所有的东西都移到视图的左边。请更具描述性。我基本上会有一些布局,如果需要的话可以拉伸(比如QGridLayout)。当窗口调整大小时,位于客户端左侧区域的内容会转到新位置,但我在右侧区域绘制的内容不会移动到新位置。很抱歉,这没有任何意义。如果画在右边的东西没有移动,你的屏幕截图中就会有你所拥有的东西(即停留在中间)。你现在说的是调整尺寸?所以需要应用一些缩放?请做一个你想要发生的真实的模型,并请展示你迄今为止为自己解决这个问题所做的努力。