2016-12-02 23 views
1

Я пытаюсь реализовать базовое drag n 'drop в QML. Функционально это работает - я могу перетащить строку вокруг. Тем не менее, я не могу заставить свой draggable Rectangle объект следовать курсору. Он устанавливает x и y Rectangle правильно, что он становится видимым, но затем он остается неподвижным, а не перемещается мышью. Вот мой код:Перетаскиваемые элементы, не работающие в QML

MouseArea { 
    id: mouseArea 
    anchors.fill: parent 
    drag.target: draggable 
} 

Rectangle { 
    id: draggable 
    height: 18 
    width: dragText.width + 8 
    clip: true 
    color: "#ff333333" 
    border.width: 2 
    border.color: "#ffaaaaaa" 
    visible: false 
    anchors.verticalCenter: parent.verticalCenter 
    anchors.horizontalCenter: parent.horizontalCenter 

    Drag.active: mouseArea.drag.active 
    Drag.hotSpot.x: 0 
    Drag.hotSpot.y: 0 
    Drag.mimeData: { "text/plain": "Teststring" } 
    Drag.dragType: Drag.Automatic 
    Drag.onDragStarted: { 
     visible = true 
    } 
    Drag.onDragFinished: { 
     visible = false 
    } 

    Text { 
     id: dragText 
     x: 4 
     text: "Teststring" 
     font.weight: Font.Bold 
     color: "#ffffffff" 
     horizontalAlignment: Text.AlignHCenter 
    } 
} 
+0

Что вы собираетесь делать здесь? Вы пытаетесь перетащить элемент с помощью 'visible: false'? – folibis

+0

Нет, я установил элемент на видимый, как только начнется перетаскивание (см. Drag.onDragStarted). – user1765354

+0

Какой смысл перетаскивать невидимый элемент? Какова ваша цель? Возможно, это можно было бы сделать по-другому. – folibis

ответ

0

Я в конечном итоге решил это, полностью избегая рамки Draggable и в основном используя обходные пути. Я добавил следующее к моему MouseArea сделать прямоугольник двигаться правильно:

onMouseXChanged: { 
    draggable.x = mouseX - draggable.width/2 
} 
onMouseYChanged: { 
    draggable.y = mouseY - draggable.height/2 
} 

Для имитации падения функциональности, я программно вычислить положение «капельно области», сравнить его с положением мыши с рудиментарным обнаружения столкновений, а затем добавьте в ListView, который прикреплен к области «drop».

1

Ваш прямоугольник не перемещается, потому что вы устанавливаете привязки к вашему прямоугольнику. Анкеры предназначены для установки на неподвижную точку крепления.

Удалить

anchors.verticalCenter: parent.verticalCenter 
anchors.horizontalCenter: parent.horizontalCenter 

в вашем QML.

Если вы хотите разместить его в центре родителя, вам нужно будет установить его, как это вместо:

x: parent.width/2 - this.width/2 
y: parent.height/2 - this.height/2 

Вы также можете удалить

Drag.dragType: Drag.Automatic 

если прямоугольник должен следовать за вашим курсором, а не только двигаться, после того, как сопротивление закончилось.

+0

Спасибо! Извините, недостаточно репутации для повышения. – user1765354

+0

Итак, у меня все еще есть некоторые проблемы. Когда я удаляю Drag.dragType: Drag.Automatic, прямоугольник перемещается правильно, но состояние «перетаскивания» никогда не попадает. Поэтому я должен выбирать между фактическим перетаскиванием текста (функциональности) по сравнению с прямоугольником, движущимся с помощью курсора (визуализация). Я бы хотел, чтобы оба. – user1765354