PyQt5 为 QPushButton 实现长按和解决跟 clicked 事件的冲突

Python
421
0
0
2022-04-11
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtGui import QMouseEvent
from PyQt5.QtCore import QTimer, pyqtSignal

class PushButton(QPushButton):
    long_pressed = pyqtSignal()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.timer = QTimer()
        self.timer.timeout.connect(self._long_pressed)

    def mousePressEvent(self, evt: QMouseEvent):
        super().mousePressEvent(evt)
        self.timer.start(1000)

    def mouseReleaseEvent(self, evt: QMouseEvent):
        # 长按后此方法仍会触发 clicked 事件,需要禁止信号发射。 
        if self.timer.remainingTime() <= 0:
            self.blockSignals(True)
        self.timer.stop()
        super().mouseReleaseEvent(evt)
        self.blockSignals(False)

    def _long_pressed(self):
        self.timer.stop()
        self.long_pressed.emit()