2011-12-05 3 views
2

내 문제는 가난한 저항 막 터치 스크린입니다. 화면을 가로 질러 손가락을 끕니다. 드래그는 MouseButtonRelease 이벤트로 인해 임의로 끊어집니다.Qt : 우발적 인 (연속적인) MouseButtonRelease 및 MouseButtonPress 이벤트를 어떻게 필터링합니까?

나는 mouseEvents를 필터링하고 모든 연속적인 MouseButtonRelease 및 MouseButtonPress 이벤트를 제거하여이를 해결하고자합니다. 100ms 미만의 appart. 이 응용 프로그램 전체에 적용하고 싶습니다.

이미 eventFilter를 시도했지만 제대로 작동하지 않습니다. 저장된 MouseButtonRelease 이벤트는 올바른 개체로 보내지지 않습니다. installEventFilter (new MouseFilter (this))에 의해 이것을 설치했습니다; 위젯에서는 모든 마우스 릴리즈가 사라집니다.

다른 접근 방식을 제안하거나 내 코드에 문제가 있습니까?

#include "mousefilter.h" 
#include <QApplication> 
#include <QEvent> 
#include <QMouseEvent> 
#include <QTimer> 

MouseFilter::MouseFilter(QObject *parent) : 
    QObject(parent), 
    storedEvent_(0) 
{ 
} 

void MouseFilter::send() { 
    if (storedEvent_ == 0) { 
    return; 
    } 
    QApplication::sendEvent(parent(), storedEvent_); 
    delete storedEvent_; 
    storedEvent_ = 0; 
} 

bool MouseFilter::eventFilter(QObject *object, QEvent *event) { 
    if (event->type() == QEvent::MouseButtonRelease) { 
    QMouseEvent* release = static_cast<QMouseEvent*>(event); 
    // Dalay the event 
    storedEvent_ = new QMouseEvent(QEvent::MouseButtonRelease, release->pos(), release->globalPos(), 
            release->button(), release->buttons(), release->modifiers()); 
    QTimer::singleShot(100, this, SLOT(send())); 
    return true; 
    } 
    else if (storedEvent_ != 0 && event->type() == QEvent::MouseButtonPress) { 
    // Clear stored release and ignore new press. 
    delete storedEvent_; 
    storedEvent_ = 0; 
    return true; 
    } 

    return QObject::eventFilter(object, event); 
} 
+0

운영체제 (터치 스크린 드라이버)를 사용하면 안됩니까? 그게 (애플 리케이션이 아닌)이 행동에 대한 더 자연스러운 장소가 될 것이지만, 이것이 비현실적일지도 모른다. – Unapiedra

+0

이 게시물은 도움이됩니까? http://www.qtcentre.org/threads/21999-How-to-delay-a-Signal?p=107183#post107183 그녀는'QTimer'와 관련하여'enterEvent'와'leaveEvent'를 사용하여 제안합니다. – Unapiedra

+0

"드래그 잠금"메커니즘 (Mac OS X에서 공통)을 사용할 수도 있습니다. 드레 이깅을 시작하려면 "두 번 살짝 누르십시오", 끝내려면 탭해야합니다. –

답변

1

당신은 고통의 세계에 있습니다. 나는 하드웨어 사람들에게 불평하고 아무데도 가지 않았다.

모든 릴리스 이벤트를 직접 수행 할 수 있습니다. 기본적으로 손가락이 접촉하는 동안 이벤트가 발생합니다 (고정되어 있더라도). 따라서 논리를 기반으로 타이머를 시작할 수 있습니다. 그런 다음 100ms 동안 터치 이벤트가 발생하지 않으면 마우스를 놓을 수 없습니다.

QTimer의 작동 방식은 .start()를 반복적으로 호출 할 수 있으며 카운트 다운을 다시 시작합니다.

물론 이것은 100ms의 마법 수에 의존한다는 점에서 문제가 많습니다. 응용 프로그램의 응답 속도가 느려지고 시스템 전체가 아닌 응용 프로그램의 버그 만 수정해야합니다.

관련 문제