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, ...),否则它将使代码只是令人困惑;
添加回答
举报
