Встроенный сенсорный экран Qt QMouseEvents не получен до получения MouseButtonRelease

Я использую Qt 4.8.3 на маленьком встроенном устройстве ARM Linux с сенсорным экраном. У меня сенсорный экран настроен с помощью tslib и откалиброван, поэтому в / etc / есть файл указателя. Расположение моих событий касания работает просто отлично, но независимо от того, что я получаю, QEvent for Mouse Move перед событиями Mouse Press или Mouse Release Events. Кроме того, я не получаю никаких событий, связанных с мышью, пока физически не уберу палец с сенсорного экрана. Мне нужно нормальное поведение, когда я нажимаю на сенсорном экране и сразу же получаю событие нажатия мыши, а затем мои события перемещения (если они есть) и затем событие отпускания мыши, когда я поднимаю палец.

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

Я также попытался просмотреть события QWS Server, реализовав следующий qwsEventFilter для просмотра событий 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 события, предположительно, нажимаю и отпускаю.

Я запустил «evtest» на моем устройстве / dev / input / touchscreen в Linux и, конечно, сразу же вижу нажатие на экран при нажатии. И я не получаю событие освобождения мыши, пока я не подниму палец, поэтому драйвер ведет себя как ожидалось. Также нет никаких «повторяющихся» событий касания при нажатии — это всего лишь одно событие для одного нажатия, но оно ведет себя правильно.

Я не уверен, почему я вижу поведение, которое я делаю. Должна быть проблема перевода между Qt и устройством ввода.

Кроме того, если я добавлю небольшую задержку в 3 мс при обработке моего полученного события MouseButtonRelease, то я получу желаемое поведение с точки зрения работы приложения, но я по-прежнему не получаю события мыши, пока не отпущу прессу. Мне вообще не нужно было добавлять задержку, я бы ожидал, что произойдет нажатие моей мыши, затем любые движения и, наконец, событие поворота мыши по очереди.

Кто-нибудь знает, как это исправить или что может быть причиной этого? Большое спасибо!

Я не вижу распечатанного ниже, пока не подниму палец:

...
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
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////

Вот моя функция задержки:

void Monitor::delay()
{
QTime dieTime = QTime::currentTime().addMSecs(3);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

2

Решение

Решил- нашел эту ветку: https://github.com/kergoth/tslib/issues/10 которая описывает ту же проблему. В Tslib, похоже, проблема с драйвером Atmel MXT Maxtouch. Комментирование модуля Variance в файле ts.conf решило мою проблему — теперь я получаю события нажатия мыши сразу после прикосновения к экрану.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]