You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt/QML中检测六边形Shape组件的点击事件?

在QML六边形Shape上实现点击事件的解决方案

别担心,其实你只需要把MouseArea和Shape的contains方法结合起来,就能实现只响应六边形内部点击的效果,我给你调整了代码,关键部分都加了注释:

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

Item {
    id: root
    property real srh: 20 // 这里给了个默认值方便测试,你可以根据需求自行调整

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

    // 关键:添加覆盖整个Shape的MouseArea
    MouseArea {
        anchors.fill: rootShape // 让MouseArea和Shape的大小、位置完全匹配
        onClicked: {
            // 利用Shape的contains方法,判断点击是否落在六边形填充区域内
            if (rootShape.contains(mouse.x, mouse.y)) {
                console.log("六边形被点击啦!");
                // 在这里编写你的点击处理逻辑即可
            }
        }
    }
}

核心思路说明

  • 默认MouseArea是矩形响应范围,如果直接嵌套在Shape内,会触发整个矩形区域的点击(包括六边形外的空白部分)。
  • 你设置的containsMode: Shape.FillContains会让rootShape.contains()方法仅在点击点处于六边形填充区域时返回true,刚好过滤掉无效的矩形空白区域点击,实现精准响应。

如果需要处理鼠标按下、释放或者悬停状态,也可以用同样的思路,在MouseArea的对应信号里调用contains方法做判断就行。

内容的提问来源于stack exchange,提问作者Zaragesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:32:49