Python QGraphicsSellipseitem绘制外部边界,留下瑕疵

Python QGraphicsSellipseitem绘制外部边界,留下瑕疵,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,如果您有一个QGraphicsSellipseitem,它的宽度远大于它的高度(展平),那么它在自己的边界之外进行绘制。这意味着它不能正确绘制,当你拖动它时会在屏幕上留下瑕疵。这再现了这个问题(向非Pythonistas道歉,但对C++开发者来说应该是可以理解的): 关键是QGraphicsSellipseitem的宽度为320,高度仅为5。如果选择椭圆,选择框的虚线将绘制在项目的边界处,您可以看到椭圆的左边缘和右边缘在这些边界之外。如果随后拖动该项目,将获得工件 这是在64位Windows 7

如果您有一个QGraphicsSellipseitem,它的宽度远大于它的高度(展平),那么它在自己的边界之外进行绘制。这意味着它不能正确绘制,当你拖动它时会在屏幕上留下瑕疵。这再现了这个问题(向非Pythonistas道歉,但对C++开发者来说应该是可以理解的):

关键是QGraphicsSellipseitem的宽度为320,高度仅为5。如果选择椭圆,选择框的虚线将绘制在项目的边界处,您可以看到椭圆的左边缘和右边缘在这些边界之外。如果随后拖动该项目,将获得工件

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

如果启用抗锯齿(例如,
view.setRenderHint(QtGui.QPainter.antialasing)
),椭圆将在其边界内绘制,一切正常

我宁愿选择绘制锯齿或抗锯齿,但作为最后手段,除非有更好的解决方案,否则我可以始终绘制抗锯齿。我对QGraphicsSellipseitem进行了子类化,并在基类的边界rect周围添加了大量填充,如:

def boundingRect(self):
    return QGraphicsEllipseItem.boundingRect(self).adjusted(-40, -40, 40, 40)
这在很多情况下解决了这个问题,但是如果椭圆非常大,你可能会远远超出边界,因此很难知道要添加多少填充,而且在任何情况下,这是一个相当糟糕的解决方案,因为这意味着我的边界在大多数情况下都是很远的(对碰撞检测的影响等等)

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

view.setViewportUpdateMode(QtGui.QGraphicsView.FullViewportUpdate)
为了处理一种GraphicsItem类型的绘画而不得不这样做似乎有点悲哀,因为它非常扁平

我想我可以尝试在我自己的QGraphicsSellipseitem子类中“正确”地绘制这个东西,但我怀疑基类只是告诉画师绘制一个椭圆,所以我不得不花很多时间来设计我自己的椭圆绘制算法,而不使用画师算法


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

这是QPen的问题

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

view.setViewportUpdateMode(QtGui.QGraphicsView.FullViewportUpdate)