我在QGraphicsView中有一个QMainWindows,它占用了所有客户区。在视图中,我渲染了一些QGraphicsTextItem项。只要我没有调整主窗口的大小,一切都有效。如果我这样做,物品会保持原样,不要移动到新的正确位置。基本上我要做的就是在布局小部件中有一个行为,如果需要可以扩展
更新1
更新2
更新3
使用以下代码,按钮位于客户区右侧。 944是从QGraphicsView的Qt Designer定义的宽度。我在区域左侧的小部件有相同的代码,从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);
答案 0 :(得分:3)
QGraphicsView没有直接连接到场景内的QGraphicsItem对象。其唯一目的是在视口中显示场景切片,并将用户交互传输到场景。没有布局,但是添加了布局以与QGraphicsWidget一起使用(但这是一个特殊的需求案例)。无论如何,这只与视图的翻译有关,而不是场景中项目的位置(完全不相互关联)
您最有可能需要做的是QGraphicsView的子类,并在您的视图中重新实现resizeEvent:http://qt-project.org/doc/qt-4.8/qgraphicsview.html#resizeEvent
在resizeEvent中,您可以根据调整大小将视图翻译一个金额:http://qt-project.org/doc/qt-4.8/qgraphicsview.html#translate
基本上,您在自定义QGraphicsView中创建自己的布局管理器功能。
<强>更新强>
我意识到你的意思,当sceneRect大于QGraphicsView时,它将使用滚动条而不是让你的视图居中调整大小。理想情况下,如果要创建内容不需要滚动的图形场景类型,则应保留sceneRect默认值,或将其设置为视口大小。
否则,这是一个如何使用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 :图片发布和更新后
如果你真的需要QGraphicsScene中的这种普通QWidget行为,有布局,那么你应该看看QGraphicsWidgets,它支持布局。然后你可以制作一个大的根“画布”小部件,并在布局中使其他所有内容成为其子元素。然后,您只需要担心保持根小部件的大小正确。然后,您就可以使用上面的相同示例来管理根小部件的大小和位置。
请参阅此问题以获取更多详细信息,因为有人希望将QGraphicsItem集成到布局中: QGraphicsWidget vs. QGraphicsLayoutItem