8

QTreeView でドラッグ アンド ドロップを介して移動する行を実装し、行間にドロップ インジケーターを表示する必要があります。インジケーターの描画をオーバーライドする方法があるかどうか疑問に思っているので、行間の階層のすべてのレベルに対してのみ表示されます (アイテムの周りの四角形ではありません)。線は行全体と同じ幅でなければなりません (1 つの列ではありません)。 )。

4

1 に答える 1

15

ウィジェットの描画に使用するスタイルを変更することで可能です。私の試みはうまくいったように見えましたが、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()));
}
于 2012-03-08T00:11:10.100 に答える