Проблема рисования QAbstractItemDelegate при перетаскивании

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

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

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

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

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

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

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

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


person rickb    schedule 24.03.2011    source источник


Ответы (2)


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

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

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

MyClass::dragStart(Qt::DropActions supportedActions)
{
  __dragStart = true;
  TableView::dragStart(supportedActions);
                   // request for drag cursor image happens here
  __dragStart = false;
}
person rickb    schedule 28.03.2011

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

person hmuelner    schedule 25.03.2011
comment
Да, это то, что я сделал. Приходится снимать флаг на мышке вверх. - person rickb; 25.03.2011
comment
Работает на Mac. Не работает на победе. То же самое, как если бы я просто проверял флаг QTableView::state() для DraggedState. Следующий? - person rickb; 25.03.2011
comment
Попытался установить начальное положение мыши при нажатии мыши и проверить это с текущим положением мыши при движении мыши. Работает нормально после первого перетаскивания, но первое перетаскивание все еще испорчено. - person rickb; 27.03.2011
comment
Урк. Это не исправило это полностью. Мне пришлось принудительно подать сигнал dataChanged() на модель, чтобы принудительно обновить ее. Мигает, но работает. - person rickb; 29.03.2011