我在带触摸屏的小型ARM嵌入式Linux设备上使用Qt 4.8.3。我的触摸屏配置了tslib并校准它,因此/ etc /中有一个指针文件。我的触摸事件的位置工作得很好但无论我在鼠标按下或鼠标释放事件之前获得鼠标移动的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服务器事件,以观察进入我的QApplication的QWS事件:
/// 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个事件,可能会按下并释放。
我跑步&#39; evtest&#39;在Linux上的/ dev / input / touchscreen设备上,当按下屏幕时,肯定会立即看到触碰事件。在我抬起手指之前我没有得到鼠标释放事件,因此驱动程序的行为与预期的一样。也没有重复&#39;当我按下时触发事件 - 这只是一次按下一个事件,但行为正确。
我不确定为什么我会看到我的行为。 Qt和输入设备之间必须存在转换问题。
此外,如果我在处理我的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,我在我的App中查看收到的事件:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
这是我的延迟功能:
void Monitor::delay()
{
QTime dieTime = QTime::currentTime().addMSecs(3);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}