QTreeView индикатор сброса рисования
Мне нужно реализовать перемещение строк с помощью drag-n-drop в QTreeView и показать индикатор выпадения между строками. Мне интересно, если есть способ переопределить рисование индикатора, чтобы он отображался для всех уровней иерархии только между строками (не прямоугольник вокруг элемента), линия должна быть шириной всей строки (а не один столбец)).
1 ответ
Это возможно с помощью стиля, используемого для рисования виджета. Моя попытка, казалось, сработала хорошо, но это немного обманывает систему стилей qt, поэтому я не могу гарантировать, что она будет работать под всеми возможными стилями на всех платформах. Итак, вот оно:
class myViewStyle: public QProxyStyle{
public:
myViewStyle(QStyle* style = 0);
void drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
};
myViewStyle::myViewStyle(QStyle* style)
:QProxyStyle(style)
{}
void myViewStyle::drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const{
if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()){
QStyleOption opt(*option);
opt.rect.setLeft(0);
if (widget) opt.rect.setRight(widget->width());
QProxyStyle::drawPrimitive(element, &opt, painter, widget);
return;
}
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
myView::myView(QWidget *parent) :
QTreeView(parent)
{
setStyle(new myViewStyle(style()));
}