2

LinuxでQt 4を使用しています。

タッチスクリーン ディスプレイ用のアプリケーションを実装しており、マウスとキーボードも接続しています。

マウスまたはタッチスクリーンのいずれかを実装できますが、相互にうまく作用しないため、両方を実装することはできません。主な問題は、マウスをクリックするかタッチスクリーンを押すと、次のイベントがトリガーされることです。

(注:必要なことができるように、この機能を再実装しました)

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

ただし、タッチスクリーンを押すと、同じ機能もトリガーされます:(

したがって、マウスのクリックとタッチスクリーンの押下を区別できません! – この問題を回避するにはどうすればよいですか? マウス クリックかタッチスクリーン プレスかを判断するにはどうすればよいですか?

イベントの種類を調べてみましたが、常に = 2 (mouseClickEvent ですが、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/ を印刷して見ました:

root@dm814x-evm:/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

root@dm814x-evm:/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

タッチスクリーンがマウスとして機能しているため、マウスイベントのみが生成されるようです。

これは、このフォーラムの範囲を超えている可能性がありますか?

4

2 に答える 2

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;
 }

これは間違いなくあなたの問題を解決します。乾杯乾杯!

于 2015-02-20T08:08:09.710 に答える