【问题标题】:Is there a Qt/QML function to check if a shape has been clicked?是否有 Qt/QML 函数来检查形状是否已被单击?
【发布时间】:2020-08-19 12:51:19
【问题描述】:

我正在尝试在形成六边形的 QML 形状中注册一次点击。 我知道有

Shape.FillContains() https://doc.qt.io/qt-5/qml-qtquick-shapes-shape.html#containsMode-prop

我正在尝试使用的属性。 但我不知道如何进一步进行,因为我之前刚刚使用过 MouseAreas。

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()-Handler 这样的东西会很好。

谢谢

【问题讨论】:

    标签: qt qml qt5 qqmlcomponent


    【解决方案1】:

    正如关于containsMode 的文档所说:

    如果您添加 Qt Quick Input Handlers 并且您只想在鼠标或触摸点完全位于形状内时做出反应,这很有用。

    您可以使用TapHandlerHoverHandler 之类的输入处理程序,它们使用父级的 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")
        }
    }
    

    【讨论】:

    • 感谢@GrecKo 我对 containsMode 有点困惑。
    • 你知道如何更改 HoverHandler 以便我可以像 onTapped {... } 中的代码执行类似 onHovered: {...} 的代码,但我无法在刚刚取消的文档中找到某些内容( ) 和 grabChanged() 这并不是很有帮助。 fillColor: hoverHandler.hovered ? "gold" : "steelblue" 不错,但我需要在悬停时执行更多代码
    • 这有效:HoverHandler { id: myHover onHoveredChanged: { if(hovered) { } else { } } }
    【解决方案2】:

    您链接到的文档似乎已经指向了答案。您是否尝试过将containsModeMouseArea 结合使用?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多