Qt показывает поведение, когда первое нажатие пальца убрано с сенсорного экрана - PullRequest
1 голос
/ 05 марта 2019

Я использую Qt 5.8 в Ubuntu, запускаю приложение, которое обрабатывает жест щипка для увеличения или уменьшения изображения QWidget. Проблема в том, что иногда, сразу после жеста, при взаимодействии с другими компонентами изображение скачет. В частности, это происходит, когда «Первый палец, который вы положили на экран, - это первый удаленный» (FFFR с этого момента). Можно сказать, что это происходит в половине случаев, когда выполняется пинч.

Я наблюдал, просматривая журналы событий, что когда происходит FFFR, mouseReleaseEvent этого не делает, но это происходит, если пальцы убираются с экрана наоборот. Так что я могу заставить mouseButtonRelease, когда жест щепотки заканчивается:

    if (gesture->state() == Qt::GestureFinished)
{
    QMouseEvent eve( (QEvent::MouseButtonRelease), QCursor::pos(),
           Qt::LeftButton,
           Qt::LeftButton,
           Qt::NoModifier);
    qApp->sendEvent(mGraphicsView,&eve);
}

Это решает мою проблему с переходом изображения, но у меня все еще есть проблема, так как приложение все еще не отвечает при следующем взаимодействии с ним. Кажется, что приложение по-прежнему управляется жестом «щепотка»: если я пытаюсь нажать кнопку, мне нужно дважды прикоснуться к экрану, в первый раз, чтобы просто «освободить» приложение. У меня также есть мышь: если после FFFR я перемещаю мышь, я вижу, что происходит другое событие mouseReleaseEvent (после первого, которое я вызываю с помощью приведенного выше кода), и затем я могу фактически нажать кнопку при первом касании экрана.

Это очень странное поведение, которое вы можете легко воспроизвести с помощью примера кода из документации Qt: https://doc.qt.io/qt-5/qtwidgets-gestures-imagegestures-example.html

Скомпилируйте и запустите, выбрав папку из диалога, содержащего изображения в формате JPG или PNG. Вы можете экспериментировать с реализованными жестами (панорамирование, пролистывание, вращение и масштабирование). Если выполнить двойной щелчок, изображение возвращается к исходному виду. Однако, если вы выполняете жест двумя пальцами, выполняя FFFR, при первой попытке двойного щелчка ничего не происходит. Напротив, удаляя пальцы с экрана другим способом, изображение сбрасывается при первом двойном щелчке, как и должно быть. Если у вас нет мыши, вы можете дважды нажать на экран для того же эффекта.

---- ОБНОВЛЕНИЕ ----

Я думаю, что это требует обновления ... Я понял, что жест пинч не отвечает за это поведение. Используя пример кода Qt (приведенный в ссылке выше), я вставил в класс ImageWidget фильтр событий для QGestures. Я вызываю installEventFilter(this) в конструкторе и определяю:

bool ImageWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Gesture)
    {
        gestureEvent(static_cast<QGestureEvent*>(event));
        return true;
    }else{
        return QObject::eventFilter(obj,event);
    }
}

Также я удалил исходный вызов обработчику жестов gestureEvent. Так что теперь я фильтрую QGestures для виджета изображения, но все еще обрабатываю их. И все же, если я сделаю FFFR, приложение зависнет!

Это известная ошибка Qt. Здесь сообщалось здесь , используя тот же пример документации Qt, чтобы показать этот эффект, только с двумя кнопками увеличения / уменьшения, чтобы лучше проиллюстрировать проблему. А также здесь , давая некоторые объяснения проблемы. Есть идеи как обойти эту ошибку?

...