[英]Qt5 Not Registering Touch Events
我正在努力確定某個觸摸屏是否與應用程序兼容,並且最近獲得了Elo 2402L觸摸屏的借用模型。 我已經安裝了公司提供的驅動程序,並且能夠使用evtest
實用程序( / dev / input / eventX的解析器)查看多點觸摸事件。
事實是,我正在運行使用Linux內核2.6.32的Scientific Linux 6.4。 在3.xx之前,我已經看到很多有關Linux內核的觸摸屏兼容性的信息,Elo表示他們的驅動程序僅支持2.6.32的單點觸摸。 另外,我已經看到人們說,此內核版本中與觸摸事件有關的大多數兼容性問題都與Xorg接口有關。
我開發了一個非常簡單的Qt5應用程序來測試Qt是否可以檢測到觸摸事件,因為我不確定Qt應用程序是否基於X,是否直接從/ dev / input或其他內容讀取事件。
但是,盡管有一個簡單的鼠標事件處理程序能夠正確注冊鼠標事件,但我也創建了一個簡單的觸摸事件處理程序,當我觸摸主屏幕時什么也沒有發生。 發出嗶嗶聲,作為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,並且想縮小原因,然后再說這是導致問題的設備。
另外,如果任何人對設備/內核兼容性問題有任何了解,那將非常有幫助。
QTouchEvent
文檔說:
在按下,釋放或移動觸摸設備(例如觸摸屏或觸控板)上的一個或多個觸摸點時,會發生觸摸事件。 要接收觸摸事件,小部件必須設置Qt :: WA_AcceptTouchEvents屬性,而圖形項則需要將acceptTouchEvents屬性設置為true。
可能您只需要在MainWindow
構造函數中調用setAttribute(Qt::WA_AcceptTouchEvents, true)
。
我使用觸摸事件處理程序的方式有問題嗎?
沒有觸摸事件處理程序。 如果您更改:
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。 但是同樣,我不知道您正在編寫哪種應用程序以及正在使用哪種平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.