我的自定义标签上有一个eventFilter,我想用它点击双击。这可能吗?
self.installEventFilter(self)
# Handles mouse events
def eventFilter(self, object, event):
try:
if event.buttons() == QtCore.Qt.LeftButton:
#LeftButton event
else:
# nothing is being pressed
except:
pass
答案 0 :(得分:1)
是的,这是可能的,但由于一些奇怪的原因,它并不那么简单。当然,您永远不会知道单次点击后是否会有效点击一次,从而导致双击。这就是为什么必须有一些内置的等待时间。 Qt做到这一点,并提供双击(QEvent.MouseButtonDblClick
)的事件。另一方面,即使在双击的情况下,Qt仍会为单击(QEvent.MouseButtonPress
)提供事件,但只有一次。这可能不是最好的设计。
我们必须正确区分它们。我使用额外的计时器,需要比内置的Qt计时器更长一点,以检测双击。然后代码:
from PySide import QtCore, QtGui
class MyLabel(QtGui.QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.installEventFilter(self)
self.single_click_timer = QtCore.QTimer()
self.single_click_timer.setInterval(200)
self.single_click_timer.timeout.connect(self.single_click)
def single_click(self):
self.single_click_timer.stop()
print('timeout, must be single click')
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.MouseButtonPress:
self.single_click_timer.start()
return True
elif event.type() == QtCore.QEvent.MouseButtonDblClick:
self.single_click_timer.stop()
print('double click')
return True
return False
app = QtGui.QApplication([])
window = MyLabel('Click me')
window.resize(200, 200)
window.show()
app.exec_()