내 문제는 가난한 저항 막 터치 스크린입니다. 화면을 가로 질러 손가락을 끕니다. 드래그는 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);
}
운영체제 (터치 스크린 드라이버)를 사용하면 안됩니까? 그게 (애플 리케이션이 아닌)이 행동에 대한 더 자연스러운 장소가 될 것이지만, 이것이 비현실적일지도 모른다. – Unapiedra
이 게시물은 도움이됩니까? http://www.qtcentre.org/threads/21999-How-to-delay-a-Signal?p=107183#post107183 그녀는'QTimer'와 관련하여'enterEvent'와'leaveEvent'를 사용하여 제안합니다. – Unapiedra
"드래그 잠금"메커니즘 (Mac OS X에서 공통)을 사용할 수도 있습니다. 드레 이깅을 시작하려면 "두 번 살짝 누르십시오", 끝내려면 탭해야합니다. –