适用于Android的Qt在1秒后发送MouseReleaseEvent,而在改变屏幕方向后没有释放屏幕

时间:2019-03-24 18:50:06

标签: android qt events widget

如果我在适用于Android MousePressEvent()MouseReleaseEvent()的简单Qt Widget应用程序中实现,那么一切似乎首先都可以正常工作。 如果我更改屏幕的方向(例如,从纵向更改为横向),MousePressEvent仍会按预期触发,但是MouseReleaseEvent()会在约1秒钟后自动触发,即使未释放也是如此。 如果我在触摸屏上移动的时间少于第二秒,可以防止这种情况。 有了这种行为,即使我至少更改了屏幕方向一次,就连宾客活动也不再起作用。 我还在调试器中收到以下警告:

  

libtest5.so:QMetaObject :: invokeMethod:没有此类方法Widget :: inputMethodQuery(Qt :: InputMethodQuery,QVariant)

到目前为止,我在stackoverflow上找不到任何帮助。我在高达5.12的不同Qt版本和不同的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 个答案:

答案 0 :(得分:0)

我的行为完全相同。就我而言,当我从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);