Выделение нескольких объектов
QML, выделение нескольких элементов мышкой
Приветствую всех.
Не могу разобраться как сделать выделение нескольких элементов с помощью удержания клавиши мыши. Уже разные способы пробовал, но каждый раз какой-то затык.
Вот кусок основной программы main.qml:
- import QtQuick 2.12
- import QtQuick.Window 2.12
- import QtQuick.Controls 2.5
- ApplicationWindow {
- visible: true
- title: qsTr("Selection and Scaling")
- width: Screen.desktopAvailableWidth*50/100
- height: Screen.desktopAvailableHeight*80/100
- color: "whitesmoke"
- property double my_scale: 1.0
- Flickable {
- id: _scrollSetup
- anchors.fill: parent
- boundsMovement: Flickable.StopAtBounds // если контент больше видимой области, то при перемещении контента он останавливается на границе контента с видимой областью
- contentWidth: _сolumn.width*my_scale >parent.width ? (_сolumn.width*my_scale):parent.width
- contentHeight: _сolumn.height*my_scale >parent.height ? (_сolumn.height*my_scale):parent.height
- MouseArea {
- id: _mouseFlickable
- anchors.fill: parent
- property point clickPos: "0,0"
- onWheel: if (wheel.angleDelta.y>0) { my_scale*=1.05; } else { my_scale*=0.95; } // реакция на скролл
- onClicked: console.log("_mouseFlickable.onClicked");
- onPressed: { console.log("_mouseFlickable.onPressed");
- clickPos = Qt.point(mouse.x,mouse.y)
- _rect_select.x=clickPos.x; _rect_select.y=clickPos.y;
- _rect_select.width=0; _rect_select.height=0;
- _rect_select.visible=true;
- }
- onReleased: { console.log("_mouseFlickable.onReleased");
- _rect_select.visible=false;
- }
- onEntered: console.log("_mouseFlickable.onEntered");
- onExited: console.log("_mouseFlickable.onExited");
- onPositionChanged: {
- _rect_select.x=Math.min(mouse.x,clickPos.x)
- _rect_select.y=Math.min(mouse.y,clickPos.y)
- _rect_select.width=Math.abs(clickPos.x-mouse.x)
- _rect_select.height=Math.abs(clickPos.y-mouse.y)
- }
- Column {
- id: _сolumn
- anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
- scale: my_scale
- Row {
- id: _rowUpper
- MyElement {
- id: element_1
- number: 1
- height: 160
- width: 160
- }
- MyElement {
- id: element_2
- number: 2
- height: 160
- width: 160
- }
- MyElement {
- id: element_3
- number: 3
- height: 160
- width: 160
- }
- MyElement {
- id: element_4
- number: 4
- height: 160
- width: 160
- }
- }
- Rectangle {
- anchors.horizontalCenter: parent.horizontalCenter
- height: 4
- color: "lightsteelblue"
- width: parent.width
- }
- Row {
- id: _rowLower
- MyElement {
- id: element_5
- number: 5
- height: 160
- width: 160
- }
- MyElement {
- id: element_6
- number: 6
- height: 160
- width: 160
- }
- MyElement {
- id: element_7
- number: 7
- height: 160
- width: 160
- }
- MyElement {
- id: element_8
- number: 8
- height: 160
- width: 160
- }
- }
- }
- }
- }
- Rectangle {
- id: _rect_select
- visible: false
- color: "blue"
- opacity : 0.3
- }
- }
Вот код элемента MyElement.qml:
- import QtQuick 2.0
- Item {
- property int number: 0
- property bool select: false
- MouseArea {
- id: _mouseArea
- anchors.fill: parent
- hoverEnabled: true // это для работы функции containsMouse (наведение курсора мыши на область)
- propagateComposedEvents: true
- onClicked: { console.log("_mouse_" + number + ".onClicked"); mouse.accepted = false; }
- onPressed: { console.log("_mouse_" + number + ".onPressed"); mouse.accepted = false; }
- onReleased:{ console.log("_mouse_" + number + ".onReleased"); mouse.accepted = false; }
- onEntered: { console.log("_mouse_" + number + ".onEntered"); }
- onExited: { console.log("_mouse_" + number + ".onExited"); }
- Rectangle {
- id: _rect
- anchors.fill: parent
- color: "green"
- scale: select ? 1.0 : _mouseArea.containsMouse ? 0.95 : 0.90
- }
- }
- }
Может есть мысли как это сделать.
2
99
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Как вариант, считать пересечение объектов с прямоугольником выделения,
примерный код набрасал: