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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) QDrag по сетке  (Прочитано 12072 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Февраль 10, 2015, 15:21 »

to GreatSnake: мне сотни раз говорили эту фразу. Единственный вывод, который я из неё вынес - нет не реализуемого, есть труднореализуемое.
Ну, давай переделай приватный QDragManager Смеющийся
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #16 : Февраль 10, 2015, 15:26 »

ммм.
Ну вроде попонятнее стало мне.

Так то виртуальный курсор конечно самый первый пришедший на ум выход - отрисовывать что угодно и где угодно, отсеивая рывки мышки.
Я так понимаю задача - чтобы картинка при драге прилипала, а курсор двигался плавно, получается?
Тогда действительно проще сделать виртуалку в виде pixmap'а летающего по сетке за курсором.

PS а исходники того, что уже получилось не выложите? Интересно поизучать будет, да и вдруг подобное придётся делать.
PPS и приватный переделывается) Покупается куте коммерческое и переделывается всё что хотите. (хотя я сейчас не уверен, кто то писал что и в халявной версии можно).
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #17 : Февраль 10, 2015, 15:33 »

PPS и приватный переделывается) Покупается куте коммерческое и переделывается всё что хотите. (хотя я сейчас не уверен, кто то писал что и в халявной версии можно).
Глупость. Путь в никуда.

2ТС:
коли нужна такая фича, откажись от QDrag и сам таскай айтемы.
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #18 : Февраль 10, 2015, 15:40 »

Я так понимаю задача - чтобы картинка при драге прилипала, а курсор двигался плавно, получается?

Нет, не совсем. Драгом я называю курсор+картинка, образовавшиеся после вызова drag->exec(). Достаточно, чтобы это всё вместе перемещалось по сетке. Когда драга нет, обычный курсор двигается плавно.

А исходников каких-то нет особенных. Есть у меня MainScene, унаследованная от QGraphicsScene, на которой всё это происходит, и у нее переопределен один виртуальный метод

Код:
void MainScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
    QGraphicsView * gw = views().at(0);   // с этой сценой всегда связан только один QGraphicsView

    int xpos = event->scenePos().x(),
        ypos = event->scenePos().y(); // потеряли дробную часть нафик, не нужна она

    int leftX = xpos / gridX,  // int gridX и gridY хранят шаг сетки по горизонтали и по вертикали
        leftY = ypos / gridY;   // leftX, leftY - НОМЕРА (а не координаты) узлов сетки слева и сверху от курсора

    if( xpos % gridX > gridX / 2 )  // не существенно, что средняя точка между узлами теряется, всё равно это мышь рукой возят
        leftX++;  // если остаток от деления больше половины шага сетки, то ближе правый узел, иначе левый
    if( ypos % gridY > gridY / 2 )
        leftY++;
    // номер узла * шаг сетки == координата узла на сцене
    QCursor::setPos( gw->mapToGlobal(gw->mapFromScene( leftX * gridX, leftY * gridY )) );
}

И всё, собственно... сам драг сделан стандартным способом по документации, он не изменился.
« Последнее редактирование: Февраль 10, 2015, 15:50 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #19 : Февраль 10, 2015, 15:42 »

коли нужна такая фича, откажись от QDrag и сам таскай айтемы.

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #20 : Февраль 10, 2015, 15:53 »

Тогда действительно проще сделать виртуалку в виде pixmap'а летающего по сетке за курсором.

Пока не видно, как это вообще сделать. Надо полностью перехватить перемещения мыши при выполнении драга, чтобы системный курсор не двигался. Но при этом умудриться выдавать событие QGraphicsSceneDragDropEvent в сцену.

Или может сигналы посылать... пока в раздумьях....

Проблема в том, что при вытаскивании этого драга за сцену, он должен начинать работать без всяких фокусов. А при втаскивании обратно - снова цепляться за сетку.
Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #21 : Февраль 10, 2015, 16:34 »

Описывал уже в начале, почему это не годится. Такой галимый макдональдс получится, что заранее тошно.
Можно попробовать замиксить - QDrag для внешних окон и двигание айтема на сцене.
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #22 : Февраль 10, 2015, 16:42 »

Описывал уже в начале, почему это не годится. Такой галимый макдональдс получится, что заранее тошно.
Можно попробовать замиксить - QDrag для внешних окон и двигание айтема на сцене.

Вот это и будет кошмарный гамбургер...
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Февраль 11, 2015, 10:01 »

Пока не видно, как это вообще сделать. Надо полностью перехватить перемещения мыши при выполнении драга, чтобы системный курсор не двигался. Но при этом умудриться выдавать событие QGraphicsSceneDragDropEvent в сцену.
Скрыть курсор и нарисовать его в имедже драга
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #24 : Февраль 11, 2015, 11:11 »

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

У QCursor нет метода "скрыть". Есть методы, меняющие изображение, форму, позицию. Очевидно, они не влияют на обработку перемещения мыши.
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Февраль 11, 2015, 11:47 »

Скрыть курсор и нарисовать его в имедже драга
Да, это ничего не даст - теперь дергаться будет "искусственный" курсор  Улыбающийся Придется отказаться от DnD если хотите чисто реализовать "прилипание". Чего впрочем следовало ожидать: в том же дызайнере когда новый виджет дропается на форму - курсор не скачет.

[off]Когда-то давно читал книжку (уже и не помню название), там описывается такая модель поведения
Цитировать
- Почему бы Вам не...
- Да, но...
Т.е. любые доводы будут заведомо отвергнуты, потому что должно быть "только/именно так" - и точка. В программировании совместная работа с таким человеком невыносима  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #26 : Февраль 16, 2015, 09:52 »

Сделайте специальный айтем, который будет показывать квадратик того, куда драгающийся айтем упадет. А курсор пусть двигается как хочет.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #27 : Февраль 16, 2015, 10:28 »

Сделайте специальный айтем, который будет показывать квадратик того, куда драгающийся айтем упадет. А курсор пусть двигается как хочет.

Курсор штатным QDrag таскает то же изображение, которое лежит на сцене, это обязательно. Объекты на сцене разные, у них разные изображения и размеры иконок. Если при этом еще какой-то квадратик будет ездить...  В замешательстве
« Последнее редактирование: Февраль 16, 2015, 10:32 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #28 : Февраль 16, 2015, 10:35 »

В программировании совместная работа с таким человеком невыносима  Улыбающийся

Зато достигается именно поставленная цель, или хотя бы максимальное приближение к ней, а не "абы как бы чего-нибудь получилось".

Впрочем, это уже полный оффтопик.


« Последнее редактирование: Февраль 16, 2015, 12:22 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #29 : Февраль 16, 2015, 12:22 »

Если кому-то сильно интересно, чем закончилось: я остановился на том же режиме, как в дизайнере, то есть, перемещение свободное, привязка к сетке. Разумеется, пришлось нарисовать сетку из точек с помощью QGraphicsScene::drawBackground(). Я уверен, в дизайнере тоже так сделано потому что вариант со сменой способа перетаскивания при выходе со сцены получился бы слишком громоздким и плохо масштабируемым.

Собственно, констатация факта: есть вот такой недостаток Qt - невозможно сделать QDrag по сетке. Если кому-то интересно развитие, здесь соответствующий feature request.
« Последнее редактирование: Февраль 16, 2015, 12:38 от Гурман » Записан

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


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