У меня есть элемент ChartView, объявленный в QML, и мне нужна функция масштабирования, подобная резинке. Этого можно достичь с помощью полупрозрачного прямоугольника и элемента MouseArea. Проблема состоит в том, что с одним прямоугольником можно выбрать область сверху вниз вправо-вправо из-за того, что элемент Rectangle с отрицательным dim-s либо невидим, либо отключен. Несмотря на то, что можно применить преобразование к ПрямоугольникДобавление масштабирования резинки в ChartView через MouseArea
transform: Scale { origin.x: 0; origin.y: 0; xScale: -1}
я не смог найти, как манипулировать XScale/yScale свойства извне.
Прямо сейчас я рисую 4 прямоугольника, по одному на каждый квадрант, с правильным xScale/yScale и dims (код в конце).
Так что я удивлен, есть ли более элегантное/легкое решение проблемы?
ChartView {
id: chartViewTop
...
Rectangle{
id: rubberBandRec1
border.color: "black"
border.width: 1
opacity: 0.3
visible: false
transform: Scale { origin.x: 0; origin.y: 0; yScale: -1}
}
Rectangle{
id: rubberBandRec2
border.color: "black"
border.width: 1
opacity: 0.3
visible: false
transform: Scale { origin.x: 0; origin.y: 0; yScale: -1; xScale: -1}
}
Rectangle{
id: rubberBandRec3
border.color: "black"
border.width: 1
opacity: 0.3
visible: false
transform: Scale { origin.x: 0; origin.y: 0; xScale: -1}
}
Rectangle{
id: rubberBandRec4
border.color: "black"
border.width: 1
opacity: 0.3
visible: false
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onPressed: {
rubberBandRec1.x = mouseX; rubberBandRec1.y = mouseY; rubberBandRec1.visible = true;
rubberBandRec2.x = mouseX; rubberBandRec2.y = mouseY; rubberBandRec2.visible = true;
rubberBandRec3.x = mouseX; rubberBandRec3.y = mouseY; rubberBandRec3.visible = true;
rubberBandRec4.x = mouseX; rubberBandRec4.y = mouseY; rubberBandRec4.visible = true;
}
onMouseXChanged: {
rubberBandRec1.width = mouseX - rubberBandRec1.x;
rubberBandRec2.width = rubberBandRec2.x-mouseX;
rubberBandRec3.width = rubberBandRec3.x-mouseX;
rubberBandRec4.width = mouseX - rubberBandRec4.x;
}
onMouseYChanged: {
rubberBandRec1.height = rubberBandRec1.y - mouseY;
rubberBandRec2.height = rubberBandRec2.y - mouseY;
rubberBandRec3.height = mouseY - rubberBandRec3.y;
rubberBandRec4.height = mouseY - rubberBandRec4.y;
}
onReleased: {
var x = rubberBandRec4.x-(rubberBandRec4.width<0)*Math.abs(rubberBandRec4.width);
var y = rubberBandRec4.y-(rubberBandRec4.height<0)*Math.abs(rubberBandRec4.height);
if (Math.abs(rubberBandRec4.width*rubberBandRec4.height)>100)
chartViewTop.zoomIn(Qt.rect(x, y, Math.abs(rubberBandRec4.width),
Math.abs(rubberBandRec4.height)));
rubberBandRec1.visible = false;
rubberBandRec2.visible = false;
rubberBandRec3.visible = false;
rubberBandRec4.visible = false;
}
}
}
Спасибо, это работает. Я пробовал устанавливать x/yScaleZoom как свойство recZoom раньше, но почему-то трансформатор не мог их увидеть, почему? – z3dd
Интересно, было ли это, что трансформирование не могло их увидеть, или MouseArea не могла их видеть? Если бы они были свойствами, установленными непосредственно в recZoom, то я предполагаю, что MouseArea не будет знать о xScaleZoom или yScaleZoom –
. Я проверю в понедельник, чтобы убедиться, но IDE указала мне на 'transform: Scale {...}' и I также зарегистрировал значение xScaleZoom в onMouseXChanged. – z3dd