Поведение MultiPointTouchArea в QQuickWidget

Я пытаюсь заставить MultiPointTouchArea работать правильно внутри QQuickWidget. Рассмотрим следующий пример qml-файла (MultiPointTouchTest.qml):

import QtQuick 2.0

Rectangle {
    width: 360
    height: 480
    color: touch1.pressed ? "gray" : "black";

    MultiPointTouchArea {
        anchors.fill: parent
        minimumTouchPoints: 1
        maximumTouchPoints: 2
        enabled: true;
        touchPoints: [
            TouchPoint { id: touch1; objectName: "touch 1"; },
            TouchPoint { id: touch2; objectName: "touch 2"; }
        ]

        onGestureStarted: {
            gesture.grab();
        }
        onPressed: {
            console.log("---onPressed---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onUpdated: {
            console.log("---onUpdated---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onReleased: {
            console.log("---onReleased---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onTouchUpdated: {
            console.log("---onTouchUpdated---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
    onCanceled: {
            console.log("---onCanceled---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
        console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
    }
}

В файле main.cpp здесь я использую QQuickWidget или QQuickView, например:

QQuickWidget* quickWidget = new QQuickWidget(QUrl("qrc:///QML/qml/MultiPointTouchTest.qml"));
if (quickWidget->status() == QQuickWidget::Ready) {
    QQuickItem* quickItem = quickWidget->rootObject();
    quickItem->setProperty("width", QApplication::desktop()->width());
    quickItem->setProperty("height", QApplication::desktop()->height());
    quickWidget->resize(QApplication::desktop()->width(), QApplication::desktop()->height());
}

или же

QQuickView* quickView = new QQuickView(QUrl("qrc:///QML/qml/MultiPointTouchTest.qml"));
... // like QQuickWidget's code

Печать MultiPointTouchArea - это другая информация для следующей последовательности операций:

  1. положи свой первый палец на сенсорный экран
  2. приложите второй палец к сенсорному экрану; первое касание пальцем становится недействительным, на данный момент неважно.
  3. убери мой второй палец; консоль печатает ---onCanceled---... касание первого пальца все еще недействительно, а touch1.pressed ложно.

При использовании QQuickView это странное поведение не происходит.

В документе Qt говорится об отмененном сигнале: "Этот сигнал испускается, когда новые события касания были отменены, потому что другой элемент украл обработку события касания".

Я не знаю, что значит документ после обыска.

Я пытаюсь прочитать исходный код, чтобы понять, что происходит, когда я касаюсь экрана, но мне нравится, когда QQuickWidget::event() отправляет сенсорное событие (TouchBegin...) в QQuickWindow, а QQuickView::event = QQuickWindow, не переопределяет,

Итак, что же в действительности означает документ Qt?

Мне нужен QQuickWidget, а не QQuickView, так как я могу использовать MultiPointTouchArea с QQuickWidget и иметь правильное ожидаемое поведение?

1 ответ

У меня была похожая проблема, и я обнаружил, что

quickWidget->setAttribute(Qt::WA_AcceptTouchEvents)

решил это.

Main.cpp

QQuickWidget *content = new QQuickWidget(QUrl("qrc:/myPopup.qml"));
content->setAttribute(Qt::WA_TranslucentBackground);
content->setClearColor(Qt::transparent);
content->setAttribute(Qt::WA_AcceptTouchEvents);
scene.addWidget(content);

myPopup.qml

import QtQuick 2.13
import QtQuick.Controls 2.13

Rectangle {
  id:itemParent
  width: 90; height: 90
  color: "red"

  MultiPointTouchArea {
    anchors.fill: parent
    minimumTouchPoints: 1
    maximumTouchPoints: 2

    touchPoints: [
        TouchPoint { id: touch1; objectName: "touch 1"; }
    ]
    onPressed: {
        console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
    }
    onReleased: {
        console.log(touch1.objectName, "onReleased:", touch1.pressed, touch1.x, touch1.y);
    }
    onTouchUpdated: {
        console.log(touch1.objectName, "onTouchUpdated:", touch1.pressed, touch1.x, touch1.y);
    }
  }
}

даже я добавил content->setAttribute(Qt::WA_AcceptTouchEvents), он обнаруживает мышь вместо касания.

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