Russian Qt Forum

Qt => Общие вопросы => Тема начата: phpCoder от Апрель 22, 2015, 17:10



Название: Drag and Drop картинок
Отправлено: phpCoder от Апрель 22, 2015, 17:10
Добрый день.
Есть QScrollArea, в ней виджет, на виджете QGridLayout. В разметке лежат QLabel (в них картинки). Хочу, чтобы можно было мышью дергать мои картинки и перемещать их в другие ячейки разметки (ну как мы дергаем айтемы в QTreeWidget, QListWidget...). Как это сделать?


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 22, 2015, 17:53
Ну а чего не прямолинейно на событиях мыши? (не вижу что мешает, где проблемы)


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 23, 2015, 08:51
Не могу сообразить как сделать.

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


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 23, 2015, 09:09
Ну просто перекрываете mousePress, mouseMove и mouseRelease. В mouseMove отслеживаете ячейку под курсором и подсвечиваете ее (флажок ловите в paintEvent). В mouseRelease замещаете. Если перемещение "локально" (в пределах виджета), то связываться с DnD часто смысла нет.

Еще правило хорошего тона - не лезть с драгом немедленно. Напр юзер нажал на ячейку - ничего еще не происходит. Только когда зажатая мышь сместилась на 3-5 пыкселей - появляется имедж драга


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 23, 2015, 19:19
Тоже не ясно - как подсвечивать ячейку, куда хочу перенести картинку? Было бы здорово сделать как в QListView - там появляется горизонтальная черта между соседними элементами (а у меня соответственно должна быть вертикальная).

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


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 23, 2015, 23:45
Как вставить виджет между двумя соседними в QGridLayout?


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 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) в контейнер, добавлял новый и перезаполнял лайаут


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 24, 2015, 08:50
Ясно, спасибо.

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


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 24, 2015, 09:37
Про лейаут - думал о том же - больше похоже на костыль.
Хм, может комбинировать гор. и верт. лейауты... Там вроде есть функция типа insert.
Нет смысла - строки "поедут". Желание "попастись" вполне понятно (тяжелое пых-пых детство :)), но надо и меру знать, а то десяток "своих" строк кода - уже и "костыль"  :)


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 24, 2015, 23:05
Да, не, детство было на с++.)

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


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 25, 2015, 06:28
Не знаете, как можно подсветить целевую ячейку (виджет в ячейке) когда на ней/ним мышка с драгом? Сейчас у меня получается сделать рамку, а вот полупрозрачную заливку - нет. Она оказывается под целевой ячейкой с виджетом. А нужно над ним.
Покрутите QPainter::setCompositionMode. Не получится - покажите скриншот(ы) чего хотите добиться


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 25, 2015, 14:57
Скриншот во вложении.

Картинка (папка) находится под подсветкой.


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 25, 2015, 17:12
Поверх светло-зеленым с альфой напр 50%
Код
C++ (Qt)
painter.fillRect(cellR, QColor(128, 255, 128, 128));
 


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 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));
   }
}


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 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)


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 27, 2015, 23:19
Да, именно так.
Поставил этот атрибут - при изменении размеров окна фон виджета контейнера стал черным.


Название: Re: Drag and Drop картинок
Отправлено: phpCoder от Апрель 27, 2015, 23:21
Т.е. нужно, чтобы пейнтер из контейнера рисовал не только на самом контейнере, но и поверх дочерних элементов (картинок).


Название: Re: Drag and Drop картинок
Отправлено: Igors от Апрель 28, 2015, 06:50
Выкладывайте тестовый проект - а то полемика слишком затянулась  :)