在qt中,事件从父代传递给子代,而不是从父代传递给子代。在你的情况下
mousePressEvent
在小部件中启动,然后可以移动到
QPushButton
或
QGraphicsView
,假设在这种情况下
Q图形视图
然后它发生在您的子窗口小部件上,称为
viewport()
,此操作将在某个小部件接受事件之前完成,同样的情况也必须发生在
mouseReleaseEvent
,但对于要接收
释放事件
一定是接受了
鼠标压力
事件,唯一这样做的是
VIEW()
属于
Q图形视图
. 解决方案是在
VIEW()
属于
Q图形视图
如下所示。
class Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.btn = QPushButton("Add Line")
self.gv = QGraphicsView()
self.scene = QGraphicsScene(self)
self.gv.setScene(self.scene)
self.gv.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
lay = QHBoxLayout(self)
lay.addWidget(self.btn)
lay.addWidget(self.gv)
script_dir = sys.path[0]
image_loc = os.path.dirname(script_dir) + '/testproject/configs/files/lena.png'
print(image_loc)
#self.p_item = self.scene.addPixmap(QPixmap("lena.png"))
self.p_item = self.scene.addPixmap(QPixmap(image_loc))
self.btn.clicked.connect(self.add_line)
self.gv.viewport().installEventFilter(self) # <----
def add_line(self, event):
import pprint
print(pprint.pprint(dir(event)))
def eventFilter(self, obj, event):
if obj is self.gv.viewport():
if event.type() == QEvent.MouseButtonPress:
print('mouse press event = ', event.pos())
elif event.type() == QEvent.MouseButtonRelease:
print('mouse release event = ', event.pos())
return QWidget.eventFilter(self, obj, event)