gpt4 book ai didi

python - QGraphicsEllipseItem 在边界外绘制,留下工件

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:12 25 4
gpt4 key购买 nike

如果您有一个 QGraphicsEllipseItem,它的宽度远大于高度(展平),它会在自己的边界之外绘制。这意味着它无法正确绘制,并且在您四处拖动时会在屏幕上留下伪影。这重现了问题(向非 Python 爱好者致歉,但 C++ 用户应该很容易理解):

import sys
from PySide import QtCore, QtGui

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
scene = QtGui.QGraphicsScene()
scene.setSceneRect(0, 0, 400, 400)
ellipse = QtGui.QGraphicsEllipseItem(QtCore.QRectF(0, 0, 320, 5))
ellipse.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
ellipse.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
ellipse.setPos(40, 200)
ellipse.setPen(QtGui.QPen(QtCore.Qt.red, 1))
scene.addItem(ellipse)
view = QtGui.QGraphicsView(scene)
view.show()
sys.exit(app.exec_())

关键是QGraphicsEllipseItem的宽度是320,高度刚好是5。如果选择椭圆,选择框的虚线画在item的边界处,可以看到椭圆的左边缘和右边缘在这些边界之外。如果您随后将项目四处拖动,您将获得人工制品。

如果重要的话,这是在 Windows 7 64 位上,使用 PySide 1.1.2。

如果您打开抗锯齿(例如 view.setRenderHint(QtGui.QPainter.Antialiasing)),椭圆会在其边界内绘制,一切正常。

我宁愿选择绘制锯齿或抗锯齿,但作为最后的手段,我总是可以绘制抗锯齿,除非有人有更好的解决方案。我对 QGraphicsEllipseItem 进行了子类化,并在基类的边界矩形周围放置了大量填充,例如:

def boundingRect(self):
return QGraphicsEllipseItem.boundingRect(self).adjusted(-40, -40, 40, 40)

这在很多情况下都解决了问题,但是如果椭圆很大,您可能会超出边界很远,因此很难知道要添加多少填充,无论如何这是一个相当糟糕的解决方案,因为这意味着在大多数情况下我的界限都在数英里外(对碰撞检测等的影响)。

您还可以通过更改 View 的更新模式来停止工件,即:

view.setViewportUpdateMode(QtGui.QGraphicsView.FullViewportUpdate)

只在非常扁平化的情况下,不得不这样处理一个GraphicsItem类型的绘制,似乎有点难过……

我想我可以尝试在我自己的 QGraphicsEllipseItem 子类中“正确地”绘制这个东西,但我怀疑基类只是告诉画家画一个椭圆,所以我不得不在接下来的时间里乱七八糟提出我自己的不使用画家一号的椭圆绘图算法...

还有其他想法吗?什么看起来是最不坏的选择?我倾向于只打开 FullViewportUpdate。

最佳答案

这是QPen的问题。

如果您使用宽度更大的 QPen(例如 1.2),问题就会消失(如果我没记错的话,默认情况下,对于连接,QPen 会在找到交点时扩展线条)。

关于python - QGraphicsEllipseItem 在边界外绘制,留下工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15224761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com