如果您有一個QGraphicsEllipseItem,其寬度比高度更寬(展平),它繪製的是自己的邊界之外。這意味着它不能正確繪製,並在拖動時在屏幕上留下僞影。此重新產生問題(道歉非Pythonistas,但它應該是完全可以理解的,以C++ ERS):QGraphicsEllipseItem繪製外部邊界,葉子文物
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的高度。如果選擇橢圓,則選擇框的虛線會繪製在項目的邊界上,並且您可以看到橢圓的左邊緣和右邊緣在這些邊界之外。如果你隨後拖動項目,你會得到文物。
這是在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.setViewportUpdateMode(QtGui.QGraphicsView.FullViewportUpdate)
這似乎有點傷心,不得不這樣做是爲了對付一個GraphicsItem類型的只是在畫情況下,它是非常扁...
我想我可以嘗試在我自己的QGraphicsEllipseItem子類中正確地繪製事物,但我懷疑基類只是告訴畫家繪製一個橢圓, D必須弄亂很多,才能拿出我自己的橢圓繪圖算法,它不使用畫家的...
有沒有其他想法?什麼似乎是最不好的選擇?我傾向於開啓FullViewportUpdate。