#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();
}
}
}
}