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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: drag & drop  (Прочитано 3853 раз)
shadow
Гость
« : Декабрь 08, 2017, 20:08 »

Доброго всем времени суток!

Разбираю стандартный пример из Qt dragdroprobot, вроде все понятно но возник вопрос как обмениваться цветами между двумя объектами а не только менять цвет у робота?

Пытался менять цвет в:
Код:
void RobotPart::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    dragOver = false;
    if (event->mimeData()->hasColor())
        color = qvariant_cast<QColor>(event->mimeData()->colorData());
    update();
}

но тут уже указатель объекта на котором отпускаешь круг с цветом.

Как получить указатель на перемещаемый объект(или как это правильно реализовать)?

Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 10, 2017, 12:34 »

Этот пример не смотрел, но DnD задуман как "самодостаточный", т.е. также и для обмена данных между приложениями. Поэтому передаваемые данные нужно сливать в поток (QByteArray). Передавать ID объектов и даже их адреса не запрещено, но  тогда об обмене "между приложениями" речь уже не идет.
Записан
shadow
Гость
« Ответ #2 : Декабрь 10, 2017, 13:30 »

Этот пример не смотрел, но DnD задуман как "самодостаточный", т.е. также и для обмена данных между приложениями. Поэтому передаваемые данные нужно сливать в поток (QByteArray). Передавать ID объектов и даже их адреса не запрещено, но  тогда об обмене "между приложениями" речь уже не идет.
Я не хочу обмениваться данными между приложениями мне бы обменяться данными между двумя QGraphicsItem?
В dropEven можно получить какой нибудь индитификатор(порядковый номер например) перетаскиваемого объекта из QMime но как потом найти этот объект(и выполнить с ним требуемые модификации)?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 10, 2017, 14:51 »

Я не хочу обмениваться данными между приложениями мне бы обменяться данными между двумя QGraphicsItem?
В dropEven можно получить какой нибудь индитификатор(порядковый номер например) перетаскиваемого объекта из QMime но как потом найти этот объект(и выполнить с ним требуемые модификации)?
Сериализовать порядковый номер в QByteArray и сделать QMimeData::setData. А на стороне приемника проверить mimeType и десериализовать. Или если mimeType совпадает, то использовать глобальную переменную или сингтон. На худой конец запихнуть в QColor  Улыбающийся Более изящных решений в DnD не будет, Вы уже знаете почему
Записан
shadow
Гость
« Ответ #4 : Декабрь 10, 2017, 16:05 »

Я извиняюсь но я пока новичок в Qt(и С++ тоже) поясните пожалуйста:
Цитировать
Сериализовать порядковый номер в QByteArray и сделать QMimeData::setData. А на стороне приемника проверить mimeType и десериализовать. Или если mimeType совпадает, то использовать глобальную переменную или сингтон.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 11, 2017, 15:20 »

Сериализовать - значит сделать дамп данных, где есть только последовательность значений (без всяких объектов), часто для записи на диск или передачи по сети. Десериализовать - обратный процесс, создать объекты из дампа.  Пример сериализации
Код
C++ (Qt)
QByteArray ba;
QDataStrem strm(&ba, QIODevice. QIODevice::WriteOnly);
ba << theNomer;
// теперь ba содержит сериализованный номер,
// подаете этот ba в setMime
Пример десериализации
Код
C++ (Qt)
// получили ba из мими
const QByteArray ba = mimeData->data("Nomer");
QDataStrem strm(ba);
int theNomer;
ba >> theNomer;
 
Записан
shadow
Гость
« Ответ #6 : Декабрь 12, 2017, 20:23 »

Решил задачу: Макс Шлее стр. 484
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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