QTreeView индикатор рисования - PullRequest
6 голосов
/ 29 сентября 2011

Мне нужно реализовать перемещение строк с помощью drag-n-drop в QTreeView и показывать индикатор выпадения между строками. Мне интересно, если есть способ переопределить рисование индикатора, поэтому он отображается для всех уровней иерархии только между строками (не прямоугольник вокруг элемента), линия должна быть такой же ширины, как и вся строка (а не один столбец) ).

1 Ответ

13 голосов
/ 08 марта 2012

Это возможно с помощью стиля, используемого для рисования виджета.Моя попытка, похоже, удалась, но это немного обманывает систему стилей 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()));
}
...