2013-10-22 76 views
1

我在Linux上使用Qt 4。按下觸摸屏觸發mousePressEvent,如何確定鼠標點擊或觸摸屏是否點擊?

我實現了用於觸摸屏顯示的應用程序,我也有一個鼠標和鍵盤插上。

我可以實現的小鼠或觸摸屏,但不能同時因爲他們彼此交互嚴重。主要問題是,當我點擊鼠標或按下觸摸屏時,我會觸發以下事件。

(注:我重新實現此功能,這樣我可以做到這一點的東西,我需要)

MainWindow::mousePressEvent(QMouseEvent *ev) 
{ 
    // Handle mouse specific events 
} 

然而,當我按下觸摸屏我也得到了同樣的功能觸發:(

我因此無法區分鼠標點擊和觸摸屏按鍵! - 我該如何解決這個問題?我怎樣才能確定它是否是鼠標點擊或觸摸屏按?

我曾嘗試查看事件類型,但其始終= 2(mouseClickEvent,但neve TouchBegin等)。目前,我堅持在這裏:(

編輯:

我已進一步看着這並實施財產以後這樣的:如果

MainWindow::MainWindow(QWidget *parent) 
{ 
... 
    qApp->installEventFilter(this); 
    setAttribute(Qt::WA_AcceptTouchEvents); 
    setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); 
} 
bool MainWindow::eventFilter(QObject *, QEvent * pEvent) 
{ 
    switch(pEvent->type()) 
    { 
    case QEvent::TouchBegin: 
     qDebug("BEGIN"); 
     break; 
    case QEvent::TouchUpdate: 
     qDebug("UPDATE"); 
     break; 
    case QEvent::TouchEnd: 
     qDebug("END"); 
     break; 
    case QEvent::MouseMove: 
     qDebug("MOUSE"); 
     break; 
    }; 
    return false; 
} 

我發現,我總是得到一個MouseMove事件不管其觸摸屏輸入或鼠標輸入。

我決定,我的硬件設置必須使得我的觸摸屏的作用就像一個鼠標,而不是觸摸屏(如果可能的話)。因此,我已印刷我的/ dev/inputs /看到:

[email protected]:/dev/input# ls -l 
drwxr-xr-x 2 root  root   180 Jan 1 2000 by-id 
drwxr-xr-x 2 root  root   180 Jan 1 2000 by-path 
crw-r----- 1 root  root  13, 64 Jan 1 2000 event0 
crw-r----- 1 root  root  13, 65 Jan 1 2000 event1 
crw-r----- 1 root  root  13, 66 Jan 1 2000 event2 
crw-r----- 1 root  root  13, 67 Jan 1 2000 event3 
crw-r----- 1 root  root  13, 68 Jan 1 2000 event4 
crw-r----- 1 root  root  13, 69 Jan 1 2000 event5 
crw-r----- 1 root  root  13, 70 Jan 1 2000 event6 
crw-r----- 1 root  root  13, 71 Jan 1 2000 event7 
lrwxrwxrwx 1 root  root   69 May 1 08:11 keyboard -> /dev/input/by-id/usb-Cypress_WinCE_USB_Keyboard___PS2_Mouse-event-kbd 
lrwxrwxrwx 1 root  root   6 Jan 1 2000 keypad -> event2 
crw-r----- 1 root  root  13, 63 Jan 1 2000 mice 
crw-r----- 1 root  root  13, 32 Jan 1 2000 mouse0 
crw-r----- 1 root  root  13, 33 Jan 1 2000 mouse1 
crw-r----- 1 root  root  13, 34 Jan 1 2000 mouse2 
crw-r----- 1 root  root  13, 35 Jan 1 2000 mouse3 
lrwxrwxrwx 1 root  root   67 May 1 08:11 touchscreen -> /dev/input/by-id/usb-eGalax_Inc._USB_TouchController-event-joystick 

[email protected]:/dev/input/by-id# ls -l 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-Cypress_WinCE_USB_Keyboard___PS2_Mouse-event-kbd -> ../event0 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-Cypress_WinCE_USB_Keyboard___PS2_Mouse-event-mouse -> ../event1 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-Cypress_WinCE_USB_Keyboard___PS2_Mouse-mouse -> ../mouse0 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-eGalax_Inc._USB_TouchController-event-joystick -> ../event3 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-eGalax_Inc._USB_TouchController-event-mouse -> ../event6 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-eGalax_Inc._USB_TouchController-joystick -> ../mouse1 
lrwxrwxrwx 1 root  root   9 Jan 1 2000 usb-eGalax_Inc._USB_TouchController-mouse -> ../mouse3 

在我看來,觸摸屏是作爲一個鼠標,因此只會產生鼠標事件。

現在,這可能是超出了本次論壇的範圍是什麼?

+1

我認爲這更多的是與Linux的問題。在過去,當處理Windows觸摸事件時,操作系統中有一個設置來停止觸發事件作爲鼠標事件發送。在OSX上它只是按預期工作。我認爲你需要在Qt之外尋找它,因爲它聽起來像操作系統在Qt接收它們之前將觸摸轉換爲鼠標事件。 – TheDarkKnight

+0

@ Merlin069哈哈,我只是來同可能的結論:)我說我的編輯下一些更多的信息,但我也認爲這可能是超出範圍爲這個論壇...我應該把它移動到超級用戶? –

回答

2
bool eventFilter(QObject * p_obj, QEvent * pevent) 
{ 
    if (pevent->type() == QEvent::MouseButtonDblClick || 
    pevent->type() == QEvent::MouseButtonPress || 
    pevent->type() == QEvent::MouseButtonRelease || 
    pevent->type() == QEvent::Wheel) 
    { 
    QMouseEvent* pMouseEvent = dynamic_cast<QMouseEvent*>(pevent); 
    if ((pMouseEvent != NULL) && (pMouseEvent->source() == Qt::MouseEventSource::MouseEventSynthesizedBySystem)) 
    { 
     p_event->ignore(); 
     return true; 
    } 
    } 
    return false; 
} 

這一定會解決您的問題。乾杯 乾杯!

+0

它一個合理的答案,雖然我無法驗證它,因爲我工作的項目過長...不見了:○...嗯,歡呼喝彩? –

+0

不幸的是,'的Qt :: MouseEventSource'在Qt5.4推出 感謝反正共享。 – Zermingore

相關問題