QAbstractItemDelegate рисования при перетаскивании проблемы - PullRequest
1 голос
/ 25 марта 2011

Я перегружаю функцию paint () в QAbstractItemDelegate (мой собственный класс делегата Item).

При перетаскивании рисует содержимое всей ячейки, что мне не нужно. Я предполагаю, что функция paint () вызывается с чем-то конкретным при перетаскивании, но, похоже, я не могу найти это.

Самое близкое, что мне удалось найти, - это переменная QState в собственном классе представления (функция доступа QTableView :: state () защищена.) Создавая функцию в моем производном от QTableView классе, называемую isDragging () который вызывает эту функцию и возвращает ли перетаскивание или нет, я могу определить в своем классе делегата, перетаскиваю ли я или нет, и могу изменить функцию paint ().

Это почти работает.

Проблема в том, что в исходной ячейке отображается измененное изображение краски, которое мне не нужно - я хочу оставить изображение в исходной ячейке без изменений.

Полагаю, мне нужно изучить примеры и посмотреть, есть ли что-то, что делает это ...

Я просканировал источник Qt и вижу, где он устанавливает растровое изображение перетаскивания, вызывая функцию QItemDelegate :: paint (), но единственное, что он меняет, - это принудительно вызывает QStyle :: State_Selected в стиле опции элемента. Этого недостаточно, поскольку элемент уже выбран.

Есть ли способ узнать, как явно перетаскивать содержимое ячейки при перетаскивании?

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Хорошо, окончательный ответ на этот вопрос состоял в том, чтобы, да, установить флаг на startDrag, но вместо того, чтобы оставлять его и сбрасывать его при событии кнопки отпускания мыши, просто вызовите базовый метод и затем сбросьте.

Причина в том, что изображение для курсора запрашивается (и рисуется) только один раз, а не непрерывно во время перетаскивания, как я сначала подумал. Если оставить флаг установленным, изображение курсора будет отображаться в неподходящее время.

Итак, реализация выглядит так:

MyClass::dragStart(Qt::DropActions supportedActions)
{
  __dragStart = true;
  TableView::dragStart(supportedActions);
                   // request for drag cursor image happens here
  __dragStart = false;
}
0 голосов
/ 25 марта 2011

Почему бы тебе не сделать это самостоятельно? Установите флаг, когда начинается перетаскивание, и запомните активный ModelIndex, сделайте специальную рисование, когда флаг установлен, и очистите флаг, когда перетаскивание закончено. Вы можете сделать это, переопределив QAbstractItemView :: startDrag.

...