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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] определить координаты перетаскиваемого изображения при drag and drop  (Прочитано 15685 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« : Июль 04, 2012, 00:55 »

Здравствуйте. Имеются наследники QTableView и QAbstractTableModel, реализовываю поддержку drag and drop внутри «себя» (т.е. элементы можно перемещать в пределах одной и той же таблицы). Все элементы отображаются как картинки.

Как получить координаты верхнего левого угла картинки при перемещении в void dragMoveEvent(QDragMoveEvent *event)? event->pos() возвращает координаты курсора относительно таблицы, что мне не подходит.
« Последнее редактирование: Июль 05, 2012, 16:57 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #1 : Июль 04, 2012, 06:47 »

А перевести в глобальные нельзя ? Даже с помощью арифметики?
Или я неверно понял вопрос.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #2 : Июль 04, 2012, 09:40 »

event->pos() уже являются глобальными (относительно таблицы), но это координаты курсора, а мне нужны координаты самого изображения (достаточно лишь левого верхнего угла), которое я тащу. ну или хотя бы координаты курсора относительно изображения – из них уже можно будет получить всё что нужно.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
_OLEGator_
Гость
« Ответ #3 : Июль 04, 2012, 09:51 »

Поидее как то так:
Код
C++ (Qt)
QPoint QDrag::hotSpot () const
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Июль 04, 2012, 10:09 »

а как мне получить объект типа QDrag из объекта QDragMoveEvent?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
_OLEGator_
Гость
« Ответ #5 : Июль 04, 2012, 10:27 »

Ты же его должен формировать сам в начале перетаскивания.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Июль 04, 2012, 13:29 »

зачем? за меня ведь это уже делает QTableView (миме-данные с типом application/x-qabstractitemmodeldatalist), а в dropMimeData() модели я расшифровываю миме-данные как мне нужно. или я в корне не понимаю как работает d'n'd?

вьюшка настроена так:
Код
C++ (Qt)
   setDragEnabled(true);
   setAcceptDrops(true);
   setDragDropMode(QAbstractItemView::DragDrop);
   setDragDropOverwriteMode(false);
   setDropIndicatorShown(true);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #7 : Июль 05, 2012, 11:42 »

не люблю «апать» тему, но неужели никто не знает? Улыбающийся

и еще вопрос назрел: можно ли при перемещении элемента с Qt::MoveAction сразу же убирать его с исходного места, а не только после успешного дропа?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #8 : Июль 05, 2012, 12:18 »

Как вариант переопределить самому функцию и сразу делать take елемент.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #9 : Июль 05, 2012, 16:55 »

немного поизучав исходники QAbstractItemView, обнаружил, что созданный объект типа QDrag всё время «живёт» во время операции перетаскивания и имеет родителем вьюшку, поэтому его можно легко получить с помощью findChild(), так что теперь целевой индекс в dragMoveEvent и dropEvent рассчитывается так:
Код
C++ (Qt)
QPoint targetPos = event->pos() - findChild<QDrag *>()->hotSpot() + QPoint(rowHeight(0), columnWidth(0)) / 3; // последнее слагаемое определяет допустимый зазор
QModelIndex targetIndex = model()->index(rowAt(targetPos.y()), columnAt(targetPos.x())); // indexAt() в моём случае не подходит

осталось попробовать решить второй вопрос, но тему помечаю как решённую.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #10 : Июль 06, 2012, 02:14 »

Как вариант переопределить самому функцию и сразу делать take елемент.
если сразу удалять из модели взятый элемент, то программа мгновенно падает Улыбающийся

с перемещением картинок тоже разобрался (пока только для перемещения по текущему вью, другие ещё не трогал), но тут уже пошли в ход хаки. основные моменты:
  • в dragEnterEvent() запомнить исходный индекс элемента и в data() модели возвращать пустоту когда этот индекс валидный, а также сбросить выделение и спаны
  • в dragLeaveEvent() запускать таймер, который будет проверять осуществляется ли всё ещё перетаскивание (простая проверка findChild<QDrag *>() == 0)
  • «инвалидировать» исходный индекс в dropEvent(), а также в dragLeaveEvent() при условии окончания операции перетаскивания
если кому интересно, завтра могу набросать тестовый проект
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #11 : Июль 06, 2012, 06:48 »

Пиши. Я с драг и дропом в view ещё не особо копался, мне лично тема очень импонирует Улыбающийся

PS если самому полностью реализовывать дроп, падать скорее всего не будет. Можно конечно как то скрыть, но хз хз.
Записан
_OLEGator_
Гость
« Ответ #12 : Июль 06, 2012, 10:08 »

Пошли хаки - это признак того, что надо самому писать drag and drop.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #13 : Июль 06, 2012, 10:20 »

как-то нет желания передирать код из исходников Qt или копаться в платформозависимых функциях самому…
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #14 : Июль 06, 2012, 10:40 »

Каких платформозависимых Оо?
Вы же внутри программы хотите меняться, не?

Если так то достаточно драги всякие переопределить нафиг и не вызывать функций родителей, не?

PS платформозависимые функции... хм хм хм... чегой то у вас не тогой-то. Драг и дроп то в вашей программе нужен как бэ. Всё как бэ в ваших руках.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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