pyqt4鼠标释放事件未触发
pyqt4 mouse release event not firing
我正在尝试跟踪鼠标按下和鼠标释放事件,但无法识别鼠标释放事件。
import sys, os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
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)
def add_line(self, event):
import pprint
print pprint.pprint(dir(event))
pass
def mousePressEvent(self, QMouseEvent):
print 'mouse press event = ', QMouseEvent.pos()
def mouseReleaseEvent(self, QMouseEvent):
print 'mouse release event = ', QMouseEvent.pos()
# cursor = QCursor()
# print 'mouse release event = ', cursor.pos()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
在 Qt 中,事件从父级传递给子级,反之则不然。在你的情况下,事件 mousePressEvent
在 Widget 中开始,然后你可以移动到 QPushButton
或 QGraphicsView
,让我们假设在这种情况下它落在 QGraphicsView
然后它发生对于名为 viewport()
的子小部件,这将完成,直到某个小部件接受事件,mouseReleaseEvent
也必须发生同样的情况,但是对于接收 mouseReleaseEvent
的对象必须已经接受了 mousePressEvent
事件,唯一这样做的是 QGraphicsView
的 viewport()
。解决方案是在 QGraphicsView
的 viewport()
中安装一个事件过滤器,如下所示。
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)
我正在尝试跟踪鼠标按下和鼠标释放事件,但无法识别鼠标释放事件。
import sys, os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
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)
def add_line(self, event):
import pprint
print pprint.pprint(dir(event))
pass
def mousePressEvent(self, QMouseEvent):
print 'mouse press event = ', QMouseEvent.pos()
def mouseReleaseEvent(self, QMouseEvent):
print 'mouse release event = ', QMouseEvent.pos()
# cursor = QCursor()
# print 'mouse release event = ', cursor.pos()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
在 Qt 中,事件从父级传递给子级,反之则不然。在你的情况下,事件 mousePressEvent
在 Widget 中开始,然后你可以移动到 QPushButton
或 QGraphicsView
,让我们假设在这种情况下它落在 QGraphicsView
然后它发生对于名为 viewport()
的子小部件,这将完成,直到某个小部件接受事件,mouseReleaseEvent
也必须发生同样的情况,但是对于接收 mouseReleaseEvent
的对象必须已经接受了 mousePressEvent
事件,唯一这样做的是 QGraphicsView
的 viewport()
。解决方案是在 QGraphicsView
的 viewport()
中安装一个事件过滤器,如下所示。
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)