My problem is a poor resistive touch screen. When you drag your finger across the screen. The drag randomly cuts off because of the MouseButtonRelease event.
I would like to fix this by filtering the mouseEvents and removing all consecutive MouseButtonRelease and MouseButtonPress events if they occured e.g. less than 100ms appart. I would like to do this application-wide.
I already tried an eventFilter but it doesn't work properly. The stored MouseButtonRelease-events don't get sent to right objects. I installed this by installEventFilter(new MouseFilter(this)); at a widget, but all the mouse releases get lost.
Do you suggest a different approach or is there something wrong with my code?
#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);
}