如何防止图形项超出场景?如何为QGraphicsView和QGraphicsScene设置不同的背景颜色?
我想设置一个像下面图片那样的界面。
我希望 QGraphicsView
的背景颜色和窗口颜色一样,而 QGraphicsScene
的背景颜色是白色的。此外,我希望如果有物体绘制在场景边界之外,那部分就不显示(就像图片中的星星,腿被裁掉了)。
我对如何设置这些完全没有头绪。我是Qt的新手。
附注:我在使用Python,但如果你觉得方便的话,可以用C++举例。
回复Jeremy Friesner
这是我根据你的建议写的代码:
scene = QtGui.QGraphicsScene(0, 0, 256, 256)
scene.setBackgroundBrush(QtGui.QBrush(scene.palette().color(QtGui.QPalette.Window)))
scene.addRect(scene.sceneRect(), QtGui.QPen(QtCore.Qt.NoPen), QtGui.QBrush(QtCore.Qt.white))
scene.addLine(0, 0, 356, 356)
view = QtGui.QGraphicsView(scene)
self.setCentralWidget(view) # we are in a QMainWindow
如你所见,我使用场景边界添加了一个白色的矩形(QRect),并画了一条比场景边界稍大的线。这是我应用程序的截图结果(这条线也画在场景之外):
如果应用程序的大小小于场景边界(也就是说,View <= Scene
),那么场景外的部分就不会被绘制(因为滚动条不允许),但如果应用程序的大小大于场景(也就是说,View > Scene
),那么它就会被绘制出来。那该怎么解决呢?
1 个回答
我想给
QGraphicsView
设置不同的背景颜色(比如和窗口颜色一样),而给QGraphicsScene
设置另一种颜色(比如白色)。
QGraphicsScene
对象不会直接显示在屏幕上,也就是说,它不是 QWidget
的子类,因此无法直接把它放到窗口的控件层级中。要查看 QGraphicsScene
的内容,唯一的方法是把它和一个 QGraphicsView
关联起来,然后把这个 QGraphicsView
加入到控件层级中。
所以,解决你问题的方法就是在你的 QGraphicsScene
对象上调用 setBackgroundBrush(window->palette().color(QPalette::Window))
。这样,QGraphicsView
会自动显示 QGraphicsScene
的背景颜色。
如果你还想让 QGraphicsScene
的实际内容区域有不同的颜色(比如在你缩小视图后,场景区域周围会有一个和窗口背景颜色相同的边框),你可以通过在场景中添加一个合适颜色和大小的 QGraphicsRect
项来实现这个效果,大小可以通过 QGraphicsScene::sceneRect()
获取。(记得给它调用 setZValue()
,设置一个负值,这样它就会在场景中的其他对象后面!)
另外,我希望如果某个项目绘制在场景边界之外,那部分就不被渲染(就像图片中星星的腿被裁剪掉一样)。
据我所知,这就是 QGraphicsView
的正常行为——任何超出 QGraphicsScene::sceneRect()
定义区域的内容,都会自动被裁剪到这个区域内。你看到的行为和这个不一样吗?