【发布时间】:2011-12-05 09:36:30
【问题描述】:
我的问题是电阻式触摸屏不佳。当您在屏幕上拖动手指时。由于 MouseButtonRelease 事件,拖动随机中断。
我想通过过滤 mouseEvents 并删除所有连续的 MouseButtonRelease 和 MouseButtonPress 事件(如果它们发生)来解决这个问题,例如小于 100 毫秒的设备。我想在整个应用程序范围内执行此操作。
我已经尝试过一个 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);
}
【问题讨论】:
-
您不能使用操作系统(触摸屏驱动程序)来执行此操作吗?这将是这种行为(不是应用程序)更自然的地方,但我猜这可能是不切实际的。
-
这篇文章有帮助吗? qtcentre.org/threads/… 她建议将
enterEvent和leaveEvent与QTimer结合使用。 -
您也可以使用“拖动锁定”机制(在 Mac OS X 上很常见)。它需要“双击”开始拖动并点击结束。
-
我想我会等待我们设备的下一个触摸屏版本。它应该更好。你是对的,触摸屏驱动程序会更自然地放置过滤器。
标签: qt events filter touchscreen