簡體   English   中英

Qt5未注冊觸摸事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM