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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Drag and Drop картинок  (Прочитано 8078 раз)
phpCoder
Гость
« : Апрель 22, 2015, 17:10 »

Добрый день.
Есть QScrollArea, в ней виджет, на виджете QGridLayout. В разметке лежат QLabel (в них картинки). Хочу, чтобы можно было мышью дергать мои картинки и перемещать их в другие ячейки разметки (ну как мы дергаем айтемы в QTreeWidget, QListWidget...). Как это сделать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 22, 2015, 17:53 »

Ну а чего не прямолинейно на событиях мыши? (не вижу что мешает, где проблемы)
Записан
phpCoder
Гость
« Ответ #2 : Апрель 23, 2015, 08:51 »

Не могу сообразить как сделать.

Плюс, забыл сказать, перетаскивания разрешены в пределах одной строки. Т.е. нельзя взять лейбел из строки 1 и перенести в строку 2.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 23, 2015, 09:09 »

Ну просто перекрываете mousePress, mouseMove и mouseRelease. В mouseMove отслеживаете ячейку под курсором и подсвечиваете ее (флажок ловите в paintEvent). В mouseRelease замещаете. Если перемещение "локально" (в пределах виджета), то связываться с DnD часто смысла нет.

Еще правило хорошего тона - не лезть с драгом немедленно. Напр юзер нажал на ячейку - ничего еще не происходит. Только когда зажатая мышь сместилась на 3-5 пыкселей - появляется имедж драга
Записан
phpCoder
Гость
« Ответ #4 : Апрель 23, 2015, 19:19 »

Тоже не ясно - как подсвечивать ячейку, куда хочу перенести картинку? Было бы здорово сделать как в QListView - там появляется горизонтальная черта между соседними элементами (а у меня соответственно должна быть вертикальная).

Может у кого код есть, пусть примерный - чтобы было на что ориентироваться.
Записан
phpCoder
Гость
« Ответ #5 : Апрель 23, 2015, 23:45 »

Как вставить виджет между двумя соседними в QGridLayout?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 24, 2015, 07:53 »

Тоже не ясно - как подсвечивать ячейку, куда хочу перенести картинку? Было бы здорово сделать как в QListView - там появляется горизонтальная черта между соседними элементами (а у меня соответственно должна быть вертикальная).

Может у кого код есть, пусть примерный - чтобы было на что ориентироваться.
Код дать не могу - он размазан в моем большом классе, черту рисовал примерно так
Код
C++ (Qt)
void MyGridWidget::paintEvent( QPaintEvent * e )
{
// рисуем оригинал
 QWidget::paintEvent(e);  
 
// рисуем индикатор вставки
 if (mInDrag && mDragPos.x() >= 0) {
   QRect R = cellRect(mDragPos.x(), mDragPos.y());
 
   QPainter painter(this);
// установить толщину линии, цвет и др.
   painter.drawLine(R.topRight(), R.bottomRight());
 }
}
 
Как вставить виджет между двумя соседними в QGridLayout?
Я извлкекал все (takeAt) в контейнер, добавлял новый и перезаполнял лайаут
Записан
phpCoder
Гость
« Ответ #7 : Апрель 24, 2015, 08:50 »

Ясно, спасибо.

Про лейаут - думал о том же - больше похоже на костыль.
Хм, может комбинировать гор. и верт. лейауты... Там вроде есть функция типа insert.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 24, 2015, 09:37 »

Про лейаут - думал о том же - больше похоже на костыль.
Хм, может комбинировать гор. и верт. лейауты... Там вроде есть функция типа insert.
Нет смысла - строки "поедут". Желание "попастись" вполне понятно (тяжелое пых-пых детство Улыбающийся), но надо и меру знать, а то десяток "своих" строк кода - уже и "костыль"  Улыбающийся
Записан
phpCoder
Гость
« Ответ #9 : Апрель 24, 2015, 23:05 »

Да, не, детство было на с++.)

Не знаете, как можно подсветить целевую ячейку (виджет в ячейке) когда на ней/ним мышка с драгом? Сейчас у меня получается сделать рамку, а вот полупрозрачную заливку - нет. Она оказывается под целевой ячейкой с виджетом. А нужно над ним.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 25, 2015, 06:28 »

Не знаете, как можно подсветить целевую ячейку (виджет в ячейке) когда на ней/ним мышка с драгом? Сейчас у меня получается сделать рамку, а вот полупрозрачную заливку - нет. Она оказывается под целевой ячейкой с виджетом. А нужно над ним.
Покрутите QPainter::setCompositionMode. Не получится - покажите скриншот(ы) чего хотите добиться
Записан
phpCoder
Гость
« Ответ #11 : Апрель 25, 2015, 14:57 »

Скриншот во вложении.

Картинка (папка) находится под подсветкой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 25, 2015, 17:12 »

Поверх светло-зеленым с альфой напр 50%
Код
C++ (Qt)
painter.fillRect(cellR, QColor(128, 255, 128, 128));
 
Записан
phpCoder
Гость
« Ответ #13 : Апрель 26, 2015, 22:05 »

Это было бы слишком просто. Не работает. Qlabel с картинкой все равно сверху.
Код
C++ (Qt)
void ThumbnailContainer::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   painter.fillRect(event->rect(), Qt::transparent);
   if(_drag.highlightedRect.isValid())
   {
       painter.setPen(_pen);
       painter.fillRect(_drag.highlightedRect, QColor::fromRgb(72, 197, 47, 70));
       painter.drawRect(_drag.highlightedRect.adjusted(0, 0, -1, -1));
   }
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Апрель 27, 2015, 08:30 »

Это было бы слишком просто. Не работает. Qlabel с картинкой все равно сверху.
Код
C++ (Qt)
void ThumbnailContainer::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   painter.fillRect(event->rect(), Qt::transparent);
   if(_drag.highlightedRect.isValid())
   {
       painter.setPen(_pen);
       painter.fillRect(_drag.highlightedRect, QColor::fromRgb(72, 197, 47, 70));
       painter.drawRect(_drag.highlightedRect.adjusted(0, 0, -1, -1));
   }
}
Так сначала надо отрисовать саму картинку, тогда она и окажется под подсветкой. Опять не получится - выкладывайте проект, будет быстрее

Edit: ага, кажется понял. Вы рисуете не из самого виджета а из другого. Так тоже можно, но тогда назначьте Qt::WA_TranslucentBackground для него (ThumbnailContainer)
« Последнее редактирование: Апрель 27, 2015, 08:44 от Igors » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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