Существует ли функция Qt / QML для проверки, была ли нажата фигура?

#qt #qml #qt5 #qqmlcomponent

#qt #qml #qt5 #qqmlcomponent

Вопрос:

Я пытаюсь зарегистрировать щелчок в форме QML, которая образует шестиугольник. Я знаю, что есть

Форма.FillContains()https://doc.qt.io/qt-5/qml-qtquick-shapes-shape.html#containsMode-prop

свойство, которое я пытаюсь использовать. Но я не знаю, как действовать дальше, потому что я только что работал с областями мыши раньше.

 import QtQuick 2.15
import QtQuick.Shapes 1.15
import QtQuick.Extras 1.4

Item
{
    id: root
    property real srh //ScaleFactor
    Shape
    {
        id: rootShape
        width:  srh * (6.5 - 0.5)
        height: srh * 5.2
        anchors.centerIn: parent
        containsMode: Shape.FillContains

        ShapePath
        {
            id: myHexagon
            strokeWidth: 4
            strokeColor: "white"
            fillColor: "steelblue"

            //Path
            startX:         2 * srh;
            startY:                     0   * srh
            PathLine { x: 5   * srh; y: 0   * srh }
            PathLine { x: 6.5 * srh; y: 2.6 * srh }
            PathLine { x: 5.0 * srh; y: 5.2 * srh }
            PathLine { x: 2.0 * srh; y: 5.2 * srh }
            PathLine { x: 0.5 * srh; y: 2.6 * srh }
            PathLine { x: 2   * srh; y: 0   * srh }
        }
}
  

Кто-нибудь знает, как с этим работать? Что-то вроде обработчика onClicked() было бы неплохо.

Спасибо

Ответ №1:

Как говорится в документации о containsMode :

Это полезно в случае, если вы добавляете обработчики быстрого ввода Qt и хотите реагировать только тогда, когда мышь или точка касания полностью находятся внутри фигуры.

Вы можете использовать обработчик ввода, такой как TapHandler или HoverHandler , они используют метод contains своего родительского элемента.

 Shape {
    id: rootShape
    width:  srh * (6.5 - 0.5)
    height: srh * 5.2
    anchors.centerIn: parent
    containsMode: Shape.FillContains

    ShapePath {
        id: myHexagon
        strokeWidth: 4
        strokeColor: "white"
        fillColor: hoverHandler.hovered ? "gold" : "steelblue"

        //Path
        startX:         2 * srh;
        startY:                     0   * srh
        PathLine { x: 5   * srh; y: 0   * srh }
        PathLine { x: 6.5 * srh; y: 2.6 * srh }
        PathLine { x: 5.0 * srh; y: 5.2 * srh }
        PathLine { x: 2.0 * srh; y: 5.2 * srh }
        PathLine { x: 0.5 * srh; y: 2.6 * srh }
        PathLine { x: 2   * srh; y: 0   * srh }
    }
    HoverHandler {
        id: hoverHandler
    }
    TapHandler {
        onTapped: print("Hexagon clicked")
    }
}
  

Комментарии:

1. спасибо @GrecKo, я был немного смущен режимом containsMode.

2. Знаете ли вы, как изменить обработчик наведения, чтобы я мог выполнять код, подобный в onTapped {…} что-то вроде onHovered: {…} но я не могу найти что-то в документации just cancelled() и grabChanged(), что на самом деле не помогает. Заполняющий цвет: hoverHandler.hovered ? «gold»: «steelblue» довольно хорош, но мне нужно выполнить немного больше кода при наведении курсора мыши

3. Это работает: HoverHandler { id: myHover onHoveredChanged: { if (наведено) { } else { } } }

Ответ №2:

Документы, на которые вы ссылаетесь, похоже, уже указывают на ответ. Вы пробовали комбинировать containsMode с MouseArea ?

 Shape 
{
    id: shape
    signal clicked()

    containsMode: Shape.FillContains

    MouseArea
    {
        anchors.fill: parent
        onClicked:
        {
            if (shape.contains(Qt.point(mouseX, mouseY)))
            {
                shape.clicked();
            }
        }
    }
}