不幸的是,Pyqtgraph没有提供mouseRelease信号。
因此,我想修改pyqtgraphs mouseReleaseEvent
类中的GraphicsScene
方法以发出自定义信号。
但是在下面的示例中,mouseReleaseEvent函数将覆盖QWidget
父级中的等效方法,而不是pyqtgraph中的等效方法。我该如何解决和更改此方法,或者有一种更简便的方法来检测鼠标按钮的释放?
import sys, pyqtgraph
from PyQt5 import QtGui, QtWidgets
class Window(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self)
layout = QtGui.QGridLayout(self)
view = pyqtgraph.GraphicsLayoutWidget()
layout.addWidget(view,0,0)
view.scene().sigMouseClicked.connect(self.OnClick)
def OnClick(self):
print("click") # This works inside the GraphicsLayoutWidget.
def mouseReleaseEvent(self,ev): # This does only work outside the pyqtgraph widget. It overrides the method in QWidget and not in pyqtgraph.GraphicsScene()
print("released ",ev)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Window()
form.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
所以,我不知道这是否特别聪明,但是我想出了一个使用单独计时器的解决方案,该计时器可以跟踪clickEvents
的存在。我希望这对遇到类似问题的人有所帮助。
import sys, pyqtgraph
from PyQt5 import QtGui, QtWidgets, QtCore
class Window(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self)
layout = QtGui.QGridLayout(self)
self.view = pyqtgraph.GraphicsLayoutWidget()
self.timer = QtCore.QTimer()
layout.addWidget(self.view,0,0)
self.proxy = pyqtgraph.SignalProxy(self.view.scene().sigMouseMoved, rateLimit=30, slot=self.OnMouseMove)
self.view.scene().sigMouseClicked.connect(self.release)
self.timer.timeout.connect(self.release)
def release(self):
if not self.view.scene().clickEvents:
print("release after drag")
self.timer.stop()
elif not self.timer.isActive():
print("release after click")
def OnMouseMove(self):
if not self.timer.isActive() and self.view.scene().clickEvents:
self.timer.start(10) # After a drag release, this is the "wait" time before self.release is called.
def mouseReleaseEvent(self,ev): # This does only work outside the pyqtgraph widget. It overrides the method in QWidget and not in pyqtgraph.GraphicsScene()
print("released ",ev)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Window()
form.show()
sys.exit(app.exec_())