Qt: передать указатель на QObject в QMimeData - PullRequest
3 голосов
/ 24 ноября 2010

Можно ли передать указатель на объект QObject с помощью QMimeData во время операции перетаскивания? QMimeData имеет только эту функцию для хранения данных:

void QMimeData::setData(constQString &mimeType, const QByteArray &data)

но я не могу найти способ безопасного кодирования указателя в QByteArray.

Чтобы прояснить мою цель: мне нужно передать указатель на объект QObject из модели на целевой виджет во время операции перетаскивания.

Edit: Насколько я понимаю, данные Mime - это передача данных, не зависящих от приложения, из одного места в другое: URL-адреса, цвета, HTML-код. В моем случае мне нужно передать указатель на объект ресурса внутри приложения. Как вы обычно справляетесь с подобными драг-дропами?

Спасибо Антон

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

Вы можете создать подкласс QMimeData и передавать все, что захотите.

2 голосов
/ 24 ноября 2010

Чтобы быть в безопасности и элегантности, я придумал бы уникальные идентификаторы (например, строки или числа) для своих объектов и передавал их как объекты пантомимы. Восстановление строки обратно в соответствующий объект с помощью QHashmap достаточно быстро для вашей цели.

Самый грязный (не рекомендованный!) Способ состоит в том, что идентификатор является адресом указателя как int.

Если вы передаете данные MIME при взаимодействии с пользователем, вы никогда не знаете, куда они идут. Если пользователь перетаскивает указатель на окно другого приложения, оно должно полностью соответствовать ожиданиям пользователя. Приложение, которое получает искаженный объект пантомимы и терпит крах для него, является худшим. Приложение, которое получает описательную строку и позволяет пользователю понять, что он отбрасывает, вероятно, лучше всего.

Я знаю, что вы также можете, используя тип MIME, указывать, где можно сбросить полезную нагрузку, а где нет. однако квинтэссенция заключается в том, что вы должны оставаться в рамках концепции пантомимы . И это включает в себя отсутствие передачи необработанного указателя.

0 голосов
/ 21 марта 2016

Как сказал Каш и в документации Qt, подкласс QMimeData .

Затем добавьте следующее:

  • текстовые / простые данные, описывающие или представляющие перетаскиваемый объект, поэтому, если вы перетащите эти данные в notepad.exe, это приведет к чему-то важному
  • пользовательский тип данных с идентификатором или токеном, который позволяет вам знать, что некоторые отброшенные данные MIME на самом деле ваш подкласс
  • добавить свои собственные данные в подкласс

Вам все еще нужно будет протестировать qobject_cast (или dynamic_cast), потому что какая-то другая программа могла бы проксировать ваш объект данных MIME.

...