1 回答

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