QTreeView draw drop indicator
Asked Answered
G

1

9

I need to implement rows moving via drag-n-drop in QTreeView and show the drop indicator between rows. I am wondering if there is a way to override indicator drawing, so it is displayed for all levels of hierarchy between rows only (not the rectangle around the item), the line must be as wide as the entire row (not as the one column).

Gluttony answered 29/9, 2011 at 11:19 Comment(1)
I am facing similar problem. It seems that nobody knows (or wants to tell :P), so as usual in such cases, when i have some more time, I will dig through qt sources to find out what is possible and what's not. As soon as I know something I will try to answer your question.Aglaia
A
17

It is possible by modyfing style used to draw widget. My attempt seemed to work well, but it's a bit of cheating the qt's style system, so i cannot guarante that it will work under all possible styles on all platforms. So here it is:

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()));
}
Aglaia answered 8/3, 2012 at 0:11 Comment(5)
Thanks alot. Your code works fine in an Xfce-DE. "Ported" your code to python, cause I did not find a simple solution included in QT. Learned something.Carlton
I know it's been 6 years, but could you share your python code? I have a similar question.Rishi
@Rishi You can find the python code here: web.archive.org/web/http://apocalyptech.com/linux/qt/qtableviewDrais
Works as is on OSX Ventura + Qt5 and no special other style.Tilt
Memory management is missing, your myViewStyle instance is never deleted. See https://mcmap.net/q/1172950/-qstyle-ownership/…Tilt

© 2022 - 2024 — McMap. All rights reserved.