Qt для Android отправляет mouseReleaseEvent через 1 секунду, не отпуская экран после изменения ориентации экрана

#android #qt #events #widget

#Android #qt #Мероприятия #виджет

Вопрос:

Если я реализую простое приложение Qt Widget для Android, MousePressEvent() и MouseReleaseEvent() сначала кажется, что все работает правильно. Если я изменяю ориентацию экрана (например, с книжной на альбомную), MousePressEvent все равно запускается, как ожидалось, но MouseReleaseEvent() запускается автоматически примерно через 1 секунду, даже если он не выпущен. Этого можно избежать, если я перемещаюсь по сенсорному экрану менее чем за секунду. При таком поведении даже события посещения больше не будут работать после того, как я изменил ориентацию экрана хотя бы один раз. Я также получаю следующее предупреждение в отладчике:

W libtest5.so : QMetaObject::invokeMethod: Нет такого метода Widget::InputMethod Query(Qt::InputMethod query, QVariant)

Я пока не нашел никакой помощи по stackoverflow. Я тестировал на разных версиях Qt до 5.12 и на разных устройствах Android

 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "press" << event->buttons();
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug() << "release" << event->buttons();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "move"<< event->buttons();
}
  

Я ожидаю, что mouseReleaseEvent это сработает, только если я уберу пальцы с экрана. Опять же, это происходит, только если я изменил ориентацию экрана хотя бы один раз.

Ответ №1:

У меня было точно такое же поведение. В моем случае ошибка возникла при переключении с Qt 5.6.3 на Qt 5.12 (что также повлекло за собой переключение с ndk15c на ndk17c и gcc на clang).

Использование QTouchEvent вместо QMouseEvent исправило ситуацию для меня:

 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTouchEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setAttribute(Qt::WA_AcceptTouchEvents,true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::event(QEvent *event)
{
    if(event->type() == QEvent::TouchBegin)
    {
        qDebug() << "press" << event->buttons();
        return true;
    }
    else if (event->type() == QEvent::TouchEnd)
    {
        qDebug() << "release" << event->buttons();
        return true;
    }
    else if (event->type() == QEvent::TouchUpdate)
    {
        qDebug() << "move"<< event->buttons();
        return true;
    }
    else
    {
        return false;
    }
}
  

Обязательно вызовите setAttribute(Qt::WA_AcceptTouchEvents, true); в своем конструкторе.

Комментарии:

1. Большое вам спасибо! Я попробую это!