如何防止图形项超出场景?如何为QGraphicsView和QGraphicsScene设置不同的背景颜色?

2 投票
1 回答
1221 浏览
提问于 2025-04-18 07:39

我想设置一个像下面图片那样的界面。

我希望 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 个回答

-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() 定义区域的内容,都会自动被裁剪到这个区域内。你看到的行为和这个不一样吗?

撰写回答