2011-09-29 40 views
4

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

+0

私は同様の問題に直面しています。誰も知らない(または伝えたい:P)ので、いつものように、もう少し時間があるときは、qtのソースを掘り下げて、可能なものとそうでないものを見つけます。私が何かを知ったら、私はあなたの質問に答えようとします。 –

答えて

9

ウィジェットを描画するために使用されるモディフィングスタイルで可能です。私の試みはうまくいくように見えましたが、それは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())); 
} 
+0

ありがとう。あなたのコードはXfce-DEで正常に動作します。あなたのコードをPythonに "移植"しました。私はQTに含まれている単純な解決策を見つけませんでした。何かを学んだ。 – user3469861