我在一个带有触摸屏的小型ARMembedded式Linux设备上使用Qt 4.8.3。 我的触摸屏configuration了tslib并进行了校准,因此在/ etc /中有一个pointercal文件。 我的触摸事件的位置工作正常,但无论我在鼠标按下或鼠标释放事件之前获得鼠标移动的QEvent。 此外,我没有得到任何鼠标相关的事件,直到我的手指从触摸屏举起。 我需要在触摸屏上按下正常行为,并立即收到鼠标放下事件,然后移动事件(如果有的话),然后当我举起我的手指时发生鼠标释放事件。
So what I'm seeing from the point of view of events received when I pressed down and then release looks like: 50 SockAct <-- Received right at press down <-- NO Other events received until press released <-- Now release by lifting finger from screen 50 SockAct <-- Immediately received a 50 ( SockAct ) and the rest of the events below: 2 <-- 2 == mouse down 2 <-- 2 == mouse down 3 <-- 3 == mouse release / up 3 <-- 3 == mouse release / up 77 <-- 77 == redraw
我也尝试通过实现下面的qwsEventFilter来观察QWS服务器事件来观察QWS事件进入我的QApplication:
/// For investigation mouse events #include <QWSServer> #include <QWSMouseHandler> #include <QWSEvent> bool GUIApp::qwsEventFilter(QWSEvent *e) { qDebug() << e->type; if(e->type == QWSEvent::Mouse) { QWSMouseHandler *curMouse = QWSServer::mouseHandler(); qDebug() << "mouse position is: " << curMouse->pos(); } return false; /* QWSEvent::NoEvent 0 No event has occurred. QWSEvent::Connected 1 An application has connected to the server. QWSEvent::Mouse 2 A mouse button is pressed or released, or the mouse cursor is moved. See also Qt for Embedded Linux Pointer Handling. */ }
现在,当我启动我的应用程序时,我看到触摸屏幕后,同样的行为 – 即下列印刷:
2 <-- Nothing is printed until I release my finger from the screen! mouse position is: QPoint(89,312) 2 mouse position is: QPoint(89,312)
正如你可以看到一旦我释放我的手指,我得到2个事件,大概是按下并释放。
我在Linux的/ dev / input / touchscreen设备上运行了“evtest”,当按下屏幕的时候,肯定会立即看到触摸事件。 直到我抬起手指,我才得到鼠标释放事件,所以司机的行为如预期。 当我按下时,也没有“重复”触发事件 – 这只是一个按下事件,但行为正确。
我不知道为什么我看到我做的行为。 Qt和input设备之间必须存在翻译问题。
此外,如果我在处理我的MouseButtonRelease收到的事件时添加一个小的3ms延迟,那么我得到所需的行为应用程序的方式,但我仍然没有收到我的鼠标事件,直到我释放新闻。 我不应该加一个延迟,我会期望我的鼠标发生,然后任何动作,最后一个鼠标事件
有谁知道如何解决这个问题或者是什么原因造成的? 非常感谢你!
–
我没有看到下面的内容打印出来,直到我真正抬起我的手指:
... MOVE TYPE: 5 "Mouse move (382,129)" MOUSE BUTTON PRESS TYPE: 2 "Mouse Button Press (1)" MOUSE BUTTON RELEASE TYPE: 3 "Mouse Button Release (1)" ....
这里是我的eventFilter我在我的应用程序中检查我收到的事件:
//////////////////////////////////////////////////////////////////////////////////////////////////////////// // Just for kicks print out the mouse position if (event->type() == QEvent::MouseButtonPress) { qDebug() << "MOUSE BUTTON PRESS TYPE: " << event->type(); QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); qDebug() << QString("Mouse Button Press (%1)").arg(mouseEvent->button()); } if (event->type() == QEvent::MouseMove) { qDebug() << "MOVE TYPE: " << event->type(); QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); qDebug() << QString("Mouse move (%1,%2)").arg(mouseEvent->globalX()).arg(mouseEvent->globalY()); } if (event->type() == QEvent::MouseButtonRelease) { qDebug() << "MOUSE BUTTON RELEASE TYPE: " << event->type(); QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); delay(); qDebug() << QString("Mouse Button Release (%1)").arg(mouseEvent->button()); //return true; // Gobble the event } ////////////////////////////////////////////////////////////////////////////////////////////////////////////
这是我的延迟function:
void Monitor::delay() { QTime dieTime = QTime::currentTime().addMSecs(3); while( QTime::currentTime() < dieTime ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); }
解决 – 我发现这个线程: https : //github.com/kergoth/tslib/issues/10其中概述了同样的问题。 Atmel MXT Maxtouch驱动程序似乎是Tslib中的一个问题。 在ts.conf文件中注释掉差异模块解决了我的问题 – 我现在在触摸屏幕后立即获得鼠标停止事件。