Призрачный двойной клик от MouseArea на Android

При тестировании приложения на Android я заметил нечто странное. Обработчик события двойного щелчка запускается без двойного щелчка по этому конкретному элементу.

Пытаясь изолировать проблему, я обнаружил, что почти каждая цепочка щелчков выполняется быстро, как двойной щелчок, независимо от того, какие два объекта вызовут повторный щелчок по второму объекту как двойной щелчок, хотя на самом деле это всего лишь один щелчок.

Ниже приведен пример, состоящий из ряда из 3 случайно окрашенных прямоугольников, каждый из которых имеет область мыши внутри него. Двойной щелчок каждой области мыши настраивается, чтобы установить для цвета родительского прямоугольника другой случайный цвет. Быстрое нажатие на два разных прямоугольника под Android вызывает двойной щелчок и изменение цвета для второго. Этого не происходит в Windows или Ubuntu Linux.

Window {
  id: main
  visible: true
  width: 400
  height: 400
  title: qsTr("Hello World")

  Row {
    Rectangle {
      width: main.width * .33
      height: main.height
      color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      border.color: "black"
      border.width: 2
      MouseArea {
        anchors.fill: parent
        onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      }
    }
    Rectangle {
      width: main.width * .33
      height: main.height
      color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      border.color: "black"
      border.width: 2
      MouseArea {
        anchors.fill: parent
        onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      }
    }
    Rectangle {
      width: main.width * .33
      height: main.height
      color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      border.color: "black"
      border.width: 2
      MouseArea {
        anchors.fill: parent
        onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
      }
    }
  }
}

Похоже, что "предыдущий щелчок" или любое другое свойство, которое предполагается использовать для обнаружения двойных щелчков, распределяется между различными областями мыши, а не на область мыши. Проблема проявляется в Qt 5.7 и 5.7.1.

Это определенно выглядит, как моя десятая обнаруженная ошибка Qt в этом году, но я все еще чувствую, что спрашиваю о случайном случае, когда кто-то знает, что происходит и как это исправить, потому что мне нужно это исправить, а процесс сообщения об ошибках Qt не быстрый. Поэтому любые идеи приветствуются.

1 ответ

Пока не будет лучшего ответа с реальным решением, может быть полезно знать, что можно несколько смягчить разрушительное влияние, которое эта проблема оказывает на пользовательский опыт, путем сокращения глобального интервала для обнаружения двойного щелчка.

По умолчанию это довольно вялые 500 мсек. Я обнаружил, что уменьшение его до 250 мс помогает избежать более 90% неправильных двойных кликов:

QGuiApplication app(argc, argv);
app.styleHints()->setMouseDoubleClickInterval(250);

Кроме того, существует быстрый и хакерский способ создания "фиксированной" копии только для qml. MouseArea:

// MArea.qml
Item {
  id: main
  property alias mouseX : ma.mouseX
  property alias mouseY : ma.mouseY
  property alias acceptedButtons: ma.acceptedButtons
  // etc aliases
  signal clicked(var mouse)
  signal doubleClicked(var mouse)
  // etc signals, function accessors
  MouseArea {
    id: ma
    property real lClick : 0
    anchors.fill: parent
    onClicked: {
      var nc = Date.now()
      if ((nc - lClick) < 500) main.doubleClicked(mouse)
      else main.clicked(mouse)
      lClick = nc
    }
  }
}

Это на самом деле работает как задумано и может быть сделано почти полностью "подключи и играй" совместимым с оригинальным.

Другие вопросы по тегам