Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Февраль 02, 2015, 13:37



Название: Куда падает айтем?
Отправлено: Гурман от Февраль 02, 2015, 13:37
Надо поправить одну старую непонятку, раньше махнули на неё рукой, не мешало сильно.

Когда выполняется drah-n-drop айтема, лежавшего на сцене, айтем "в воздухе" рисуется относительно позиции курсора, а не на своих бывших координатах. То есть, при умолчательных значения координат он "отпрыгивает" от сцены, и повисает правее и ниже курсора. Ну это ладно, пусть. Но когда айтем падает на сцену, я принимаю QGraphicsSceneDragDropEvent *event, и беру оттуда event->scenePos() и использую эту позицию, как новые координаты на сцене, то айтем попадает не точно в то место, над которым он перед этим "висел". Он смещается немного влево и вверх. Есть такое ощущение, что он смещается на... размеры курсора. Что в общем, выглядит логично - курсор же исчез, а при возяканьи координаты ивентов указываются для него. А нам надо, чтобы он падал точно туда, где был виден.

Как от этого быстро избавиться, плз, подскажите кто-нибудь. Сейчас надо много чего делать, и вспоминать где как там нужное смещение получить - ну просто... не с руки совершенно. Надо просто + коррекцию сделать, и закрыть тему. А может быть, дело не в курсоре, в чем-то другом.

И попутно еще проблема - не вижу, как простым способом поймать айтем, если он падает ни на одну из сцен, которая имеет "приемник" dropEvent(). То есть, если юзер потащил айтем, я его снимаю со сцены, и если его вытащили куда-то вбок и там бросили, мне надо его на сцену вернуть. Но в документации не вижу ничего про такой случай. Единственный вариант просматривается - ловить события в главном приложении и устраивать полный разбор, чтобы найти случай дропа именно этого айтема мимо именно этой сцены. Но это как-то очень не по Qt-шному. (решено)


Название: Re: Куда падает айтем?
Отправлено: ammaximus от Февраль 03, 2015, 00:06
Думаю проблема в системе координат самого айтема, возможно его центр не там, где вы ожидаете. В драгндроп роботе  вроде все ровно, утром проверю как у меня


Название: Re: Куда падает айтем?
Отправлено: Гурман от Февраль 03, 2015, 00:46
Не... Когда айтем драгается, на самом деле, ездит картинка, которая привязывается вызовом  drag->setPixmap( QPixmap( pic ) ); где pic это картинка айтема на сцене, а drag это QDrag*. Картинка появляется справа внизу под курсором. При этом у drag координату "точки акцептуации" курсора можно установить с помощью QDrag::setHotSpot(). Это перемещает курсор в системе координат картинки. По идее, проблема решается вызовом drag->setHotSpot( QPoint(0,0) ); и в вениках так и работает. Но в документации написано:

Цитировать
Note: on X11, the pixmap may not be able to keep up with the mouse movements if the hot spot causes the pixmap to be displayed directly under the cursor.

Из чего следует, в X11 иконка прямо под курсором может не ездить, а надо чтобы одинаково работало везде. Вариант - прибавить к координатам курсора его размеры, и там ронять иконку, тогда она будет падать тоже хорошо.

Но я уже полдня все свободное время ищу, как динамически определять размеры курсора. Не нашел.  :( Есть только вариант его перезагрузить, и использовать известные размеры.