Qt5未注册触摸事件

时间:2019-05-22 18:18:48

标签: c++ linux qt5

我正在努力确定某个触摸屏是否与应用程序兼容,并且最近获得了Elo 2402L触摸屏的借用模型。我已经安装了公司提供的驱动程序,并且能够使用evtest实用程序( / dev / input / eventX 的解析器)查看多点触摸事件。

问题是我正在运行科学Linux 6.4,它使用Linux内核2.6.32。在3.x.x之前,我已经看到很多有关Linux内核的触摸屏兼容性的信息。 Elo说,他们的驱动程序仅支持2.6.32的单点触摸。另外,我已经看到人们说,此内核版本中与触摸事件有关的大多数兼容性问题都与Xorg接口有关。

我开发了一个非常简单的Qt5应用程序来测试Qt是否可以检测到触摸事件,因为我不确定Qt应用程序是否基于X,以及它们是否直接从 / dev / input < / strong>或其他内容。

但是,尽管有一个简单的鼠标事件处理程序能够正确注册鼠标事件,但我也创建了一个简单的触摸事件处理程序,当我触摸主屏幕时什么也没有发生。会发出哔哔声,作为Elo提供的驱动程序的一部分,当触摸屏幕时会发出哔哔声,因此我知道SOMETHING正在注册该触摸,但是台式机或此应用程序似乎都无法识别触摸事件。

,在窗口的构造函数中,WA_AcceptTouchEvents属性设置为true。

我有一个简单的mainwindow.h:

...
protected:
    int touchEvent(QTouchEvent *ev);
...

和mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) {
    ...
    setAttribute(Qt::WA_AcceptTouchEvents, true);
    touchPoints = 0;
}
...
int MainWindow::touchEvent(QTouchEvent *ev) {
    switch(ev->type()) {
        case QEvent::TouchBegin:
            touchPoints++;
            break;
        case QEvent::TouchEnd:
            touchPoints--;
            break;
    }

    ui->statusBar->showMessage("Touch Points: " + touchPoints);
}

我使用触摸事件处理程序的方式有问题吗?还是设备本身存在问题? Qt是直接从 / dev / input 读取输入事件,还是从X获取输入事件?

在这里非常困惑,因为我以前没有使用过Qt,并且想在我说这是引起问题的设备之前缩小原因的范围。

此外,如果任何人对设备/内核兼容性问题有任何了解,那将非常有帮助。

2 个答案:

答案 0 :(得分:0)

QTouchEvent documentation说:

  

按下,释放或移动一个或多个时发生触摸事件   触摸设备(例如触摸屏或触控板)上的触摸点。   要接收触摸事件,小部件必须具有   Qt :: WA_AcceptTouchEvents属性集和图形项需要具有   acceptTouchEvents属性设置为true。

可能您只需要在setAttribute(Qt::WA_AcceptTouchEvents, true)构造函数中调用MainWindow

答案 1 :(得分:0)

  

我使用触摸事件处理程序的方式有问题吗?

没有触摸事件处理程序。如果您更改:

int touchEvent(QTouchEvent *ev);

收件人:

int touchEvent(QTouchEvent *ev) override;

(在尝试覆盖虚拟函数时应始终执行此操作,以便可以准确地捕获此类错误),您将看到没有此类函数可供您覆盖。您需要覆盖的是event()处理程序:

protected:
    bool event(QEvent *ev) override;

您需要在此处检查触摸事件:

bool MainWindow::event(QEvent *ev)
{
    switch(ev->type()) {
    case QEvent::TouchBegin:
        touchPoints++;
        break;
    case QEvent::TouchEnd:
        touchPoints++;
        break;
    default:
        return QMainWindow(ev); 
    }

    ui->statusBar->showMessage("Touch Points: " + touchPoints);
}

但是,最好使用手势而不是触摸事件。但是我不知道您正在编写哪种应用程序。如果您想让Qt识别手势而不是通过触摸事件自己实现,则首先要抓住想要的手势,在这种情况下,请捏住:

setAttribute(Qt::WA_AcceptTouchEvents);
grabGesture(Qt::PinchGesture);

然后处理它:

bool MainWindow::event(QEvent *ev)
{
    if (e->type() != QEvent::Gesture) {
        return QMainWindow::event(e);
    }

    auto* gestEv = static_cast<QGestureEvent*>(e);
    if (auto* gest = gestEv->gesture(Qt::PinchGesture)) {
        auto* pinchGest = static_cast<QPinchGesture*>(gest);
        auto sf = pinchGest->scaleFactor();

        // You could use the pinch scale factor here to zoom an image
        // for example.

        e->accept();
        return true;
    }
    return QMainWindow::event(e);
}

使用手势代替触摸事件具有使用平台的手势识别功能(例如Android和iOS的手势识别功能)的优势。但是同样,我不知道您正在编写哪种应用程序以及正在使用哪种平台。