#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. Большое вам спасибо! Я попробую это!