用于按住鼠标按钮的 QT 事件过滤器

QT Event filter for holding mouse button down

我如何修改过滤器以在用户按住而不是仅仅按下时触发?我有一些东西在工作,但它并没有完全包含在过滤器中,而且它变得很乱。我不知道如何在不阻塞 UI 线程

的情况下确定用户是否按住按钮一段时间
def holdable(widget):    
    class Filter(QObject):    
        clicked = pyqtSignal()        
        def eventFilter(self, obj, event):        
            if obj == widget:
                if event.type() == QEvent.MouseButtonPress:
                    if obj.rect().contains(event.pos()):
                        self.clicked.emit()
                        return True
            return False    
    filter = Filter(widget)
    widget.installEventFilter(filter)
    return filter.clicked

我想起来也没那么难,但就是这样

def holdable(widget):
    class Filter(QObject):    
        clicked = pyqtSignal(QWidget)        
        def eventFilter(self, obj, event):        
            if obj == widget:
                if event.type() == QEvent.MouseButtonPress:
                    if obj.rect().contains(event.pos()):
                        obj.heldDown = datetime.datetime.now()
                        #return True     
                elif event.type() == QEvent.MouseButtonRelease:
                    if obj.rect().contains(event.pos()):
                        if(obj.heldDown):
                            diff = datetime.datetime.now() - obj.heldDown
                            obj.heldDown = None
                            if(diff.total_seconds() > 1):                                
                                self.clicked.emit(obj)
                                return True           
            return False    
    filter = Filter(widget)
    widget.installEventFilter(filter)
    return filter.clicked

你可以通过这样做将它挂接到一个小部件上:

holdable(widgetinstance).connect(self.holdingCallback)