1 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
您提供的是一個(gè)空的像素圖 ( self.canvas
),因此無(wú)論您選擇哪種形狀模式,它都將始終為空形狀,除非您使用BoundingRectShape
,它使用像素圖邊界矩形。
您手動(dòng)繪制圓圈的事實(shí)并不重要,因?yàn)椴豢紤]繪制碰撞檢測(cè)(也不應(yīng)該)。
您可以覆蓋該shape()
方法以提供您自己的形狀(使用 QPainterPath):
def shape(self): path = QtGui.QPainterPath() path.addEllipse(12, 12, 16, 16) return path
但是,由于您只繪制一個(gè)橢圓,因此只需使用QGraphicsEllipseItem代替。
一些未經(jīng)請(qǐng)求的建議:
如果您打算使用場(chǎng)景(QGraphicsItem 的父項(xiàng)只能是另一個(gè) QGraphicsItem),我會(huì)避免使用名稱“父項(xiàng)”,并且項(xiàng)通常不應(yīng)該“添加自身”到場(chǎng)景中;
如果您在一個(gè)場(chǎng)景中有多個(gè)項(xiàng)目并且只想使用鍵盤控制一個(gè)項(xiàng)目,通常最好覆蓋場(chǎng)景或視圖的鍵事件方法(特別是如果您使用箭頭鍵:即使?jié)L動(dòng)條被隱藏,他們?nèi)匀豢梢詳r截這些動(dòng)作);
如果您仍然想在項(xiàng)目上使用鍵盤事件,請(qǐng)確保項(xiàng)目保持鍵盤焦點(diǎn):使用
setFocus
是不夠的,因?yàn)橐坏┯脩酎c(diǎn)擊其他地方它就會(huì)失去焦點(diǎn);一種可能的解決方案是使用QGraphicsItem.grabKeyboard()
(僅在將項(xiàng)目添加到場(chǎng)景后才有效);如果您在 QFrame 上設(shè)置樣式表,它很可能至少會(huì)部分忽略任何框架選項(xiàng)集(形狀、陰影等),因?yàn)樗鼈內(nèi)Q于樣式/平臺(tái);通常最好不要將樣式表與與可視化相關(guān)的 Qt 小部件的設(shè)置混合在一起,因此在您的情況下,您可能只需要添加一個(gè)帶有正確樣式表參數(shù)集的簡(jiǎn)單 QFrame ;
雖然從技術(shù)上講這不是問(wèn)題,但通常最好與導(dǎo)入“樣式”保持一致,特別是在使用像 Qt 這樣的復(fù)雜模塊時(shí):你要么導(dǎo)入單個(gè)類 (
from PyQt5.QtWidgets import QApplication, ...
) 要么導(dǎo)入子模塊 (from PyQt5 import QtCore, ...
),否則它將使代碼只是令人困惑;
添加回答
舉報(bào)