Russian Qt Forum
Сентябрь 27, 2024, 16:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Куда падает айтем?  (Прочитано 2133 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Февраль 02, 2015, 13:37 »

Надо поправить одну старую непонятку, раньше махнули на неё рукой, не мешало сильно.

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

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

И попутно еще проблема - не вижу, как простым способом поймать айтем, если он падает ни на одну из сцен, которая имеет "приемник" dropEvent(). То есть, если юзер потащил айтем, я его снимаю со сцены, и если его вытащили куда-то вбок и там бросили, мне надо его на сцену вернуть. Но в документации не вижу ничего про такой случай. Единственный вариант просматривается - ловить события в главном приложении и устраивать полный разбор, чтобы найти случай дропа именно этого айтема мимо именно этой сцены. Но это как-то очень не по Qt-шному. (решено)
« Последнее редактирование: Февраль 02, 2015, 17:48 от Гурман » Записан

2^7-1 == 127, задумайтесь...
ammaximus
Гость
« Ответ #1 : Февраль 03, 2015, 00:06 »

Думаю проблема в системе координат самого айтема, возможно его центр не там, где вы ожидаете. В драгндроп роботе  вроде все ровно, утром проверю как у меня
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Февраль 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 иконка прямо под курсором может не ездить, а надо чтобы одинаково работало везде. Вариант - прибавить к координатам курсора его размеры, и там ронять иконку, тогда она будет падать тоже хорошо.

Но я уже полдня все свободное время ищу, как динамически определять размеры курсора. Не нашел.  Грустный Есть только вариант его перезагрузить, и использовать известные размеры.
« Последнее редактирование: Февраль 03, 2015, 00:56 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.