2013-03-05 53 views
2

如果您有一個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。

回答

3

這是QPen的問題。

如果您使用寬度更大的QPen(例如1.2),則問題會消失(如果我沒有記錯,默認情況下爲連接,QPen會在找到交點時延長線條)。