Может ли механизм перетаскивания QML работать без перемещения элемента перетаскивания? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть список и прямоугольник поверх него.В делегатах ListView есть DropArea s, а для прямоугольника включено перетаскивание по оси Y с соответствующими свойствами (точка доступа, цель).

Когда я перемещаю прямоугольник вверх и вниз в ListViewDropArea с делегатов регистрируют сигналы onEntered.Работает как задумано.

Однако я использую SmoothedAnimation для прокрутки списка вверх и вниз, когда прямоугольник находится в большинстве верхних и нижних координат (list.y = 0 и list.height).Таким образом, прямоугольник не перемещается, и DropArea s делегатов списка перемещаются под ним.В этом случае onEntered не регистрируется, поскольку перетаскивание отсутствует, прямоугольник полностью неподвижен и, хотя его hotspot входит и выходит из DropArea s, взаимодействия нет.

Это потому, что механик перетаскивания отправляет события все время во время движения, и любые DropArea s, в которые он входит, могут зарегистрировать событие.В моем случае нет перетаскивания и, следовательно, нет событий.

Вопрос: Можно ли активировать события перетаскивания вручную?Можно ли как-то симулировать перетаскивание?

1 Ответ

0 голосов
/ 19 сентября 2018

Мне удалось вызвать события перетаскивания, вручную изменив свойство hotSpot прямоугольника над списком.Документация по перетаскиванию QML гласит:

Изменения в hotSpot запускают новое движение перетаскивания с обновленной позицией.

Так что я делал это каждый раз, когда Listview contentY изменяется(происходит вертикальная прокрутка)

    onContentYChanged:
    {
        rectangle.Drag.hotSpot.x += 0.0001
        rectangle.Drag.hotSpot.x -= 0.0001
    }

Оглядываясь назад, однако, это «хакерское» решение.Свойство hotSpot является свойством класса QPointF ( ссылка ).Это означает, что он может быть установлен с использованием различных методов (setX, setY, rx, ry ..).Например, это:

rectangle.hotSpot += Qt.point(0,0)

или

rectangle.hotSpot = Qt.point(rectangle.hotSpot.x,rectangle.hotSpot.y)

должно работать теоретически, сбрасывая точку hotSpot, когда изменяется contentY, но тестирование показало, что, к сожалению, это не вызываетновое перетаскивание.(ошибка или намерение, я не знаю)

Теперь некоторые из вас, кто больше интересуется Qt и QML, могут узнать больше об этом и о том, как правильно решить проблему, но вышеупомянутое решение работает для меня и послеИспытывая все, что я мог себе представить, чтобы получить более чистое решение, я остановился на нем.

...