我正在努力确定某个触摸屏是否与应用程序兼容,并且最近获得了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,并且想在我说这是引起问题的设备之前缩小原因的范围。
此外,如果任何人对设备/内核兼容性问题有任何了解,那将非常有帮助。
答案 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的手势识别功能)的优势。但是同样,我不知道您正在编写哪种应用程序以及正在使用哪种平台。