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

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

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

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

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

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

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

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

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам