c++ - Qt5 未注册触摸事件

标签 c++ linux qt5

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

问题是我正在运行 Scientific Linux 6.4,它使用 Linux 内核 2.6.32。我见过很多关于 3.x.x 之前的 Linux 内核触摸屏兼容性的混合信息。 Elo 说他们的驱动程序仅支持 2.6.32 的单点触摸。另外,我看到有人说这个内核版本中触摸事件的兼容性问题大部分与 Xorg 接口(interface)有关。

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

但是,尽管一个简单的鼠标事件处理程序能够正确注册鼠标事件,但我还创建了一个简单的触摸事件处理程序,并且当我触摸主屏幕时没有任何反应。有一声蜂鸣声,因为 Elo 提供的驱动程序的一部分在触摸屏幕时会发出蜂鸣声,所以我知道有东西正在注册该触摸,但桌面和该应用程序似乎都无法识别触摸事件。

此外,,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,并且想在我说是设备导致问题之前缩小原因范围。

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

最佳答案

QTouchEvent documentation说:

Touch events occur when pressing, releasing, or moving one or more touch points on a touch device (such as a touch-screen or track-pad). To receive touch events, widgets have to have the Qt::WA_AcceptTouchEvents attribute set and graphics items need to have the acceptTouchEvents attribute set to true.

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

关于c++ - Qt5 未注册触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262776/

相关文章:

c++ - 如何计算 C++ 中一个函数的 CPU 消耗

java.util.date 的值自己改变了

c++ - Qt 防止为所有选项样式调用 QAbstractItemDelegate::paint()

qt - 为 QML 应用程序定义窗口图标

linux - 在Linux中,我想搜索目录中存在的文件和目录的数量

python - 有没有办法改变所有 QMessageBox 的 OK 按钮的样式表?

c++ - 如何按字段名索引 QTableWidget?

c++ - 函数被多次调用

c++ - 自动格式化 - Eclipse C++

linux - 在 64 位 Linux 上使用中断 0x80