如何防止图形项目被画出场景?以及如何为 QGraphicsView 和 QGraphicsScene 设置不同的背景颜色
Posted
技术标签:
【中文标题】如何防止图形项目被画出场景?以及如何为 QGraphicsView 和 QGraphicsScene 设置不同的背景颜色【英文标题】:How can I prevent a graphic item from to be draw out the scene? and how to have different background colors for QGraphicsView and QGraphicsScene 【发布时间】:2014-07-15 18:38:36 【问题描述】:我想像下图那样设置。
我想要QGraphicsView
(例如,与窗口颜色相同)和QGraphicsScene
(例如,白色)的不同背景颜色。另外,我希望如果某些项目被绘制出场景边界,则该部分不会被渲染(img 中的星号“任何项目”,腿被裁剪)。
我不知道如何设置它。我是 Qt 新手。
PS:我用的是python,如果你觉得舒服可以用c++举例。
回答杰里米·弗里斯纳
这是我应用您的提示的代码:
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
与QGraphicsScene
关联,并将QGraphicsView
添加到小部件层次结构中。
鉴于此,您的问题的解决方案应该是简单地在您的 QGraphicsScene
对象上调用 setBackgroundBrush(window->palette().color(QPalette::Window))
。 QGraphicsView
将自动反映QGraphicsScene
的背景颜色。
如果您希望QGraphicsScene
的实际内容区域是不同的颜色(例如,在您缩小后,场景中的不同背景颜色周围会有一个窗口背景颜色的边框-area,如屏幕截图所示),您可以通过将具有适当颜色和大小(由 QGraphicsScene::sceneRect()
给出)的 QGraphicsRect
项目添加到您的场景来获得该效果。 (一定要使用负值调用setZValue()
,这样它就会保留在场景中所有其他对象的后面!)
另外,我希望如果某些项目被拉出场景边界 部分未渲染(img 中的星号“任何项目”,腿被裁剪)。
AFAIK 这是QGraphicsView
的通常行为——QGraphicsScene::sceneRect()
定义的区域之外的任何内容都会自动剪切到该区域。您是否看到与此不同的行为?
【讨论】:
以上是关于如何防止图形项目被画出场景?以及如何为 QGraphicsView 和 QGraphicsScene 设置不同的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章
spring/hibernate 如何为我们提供防止 SQL 注入的保证以及它是如何在内部处理的?