2011-01-21 7 views
1

QTreeWidgetItemsがアイテムの上にドラッグされたときに描画される方法をオーバーライドしようとしています。私はペイントしたいQTreeWidgetItemsのQt.UserRoleデータを1に設定するためにドラッグイベントをオーバーライドしました。 Item Delegateでは、私はUserRoleを読み、それに応じて描画します。カスタムペイントにQt Delegatesを使用するには?

私のカスタムペインティングが期待通りに表示されています(太字の線)。しかし、他のすべてのペイント(テキストなど)を抑制することなく、ドラッグするための標準ペインタによる描画(つまり小さな矩形)を抑制する方法を理解できませんでした。

すべてのアイデアをいただければ幸いです。

alt text

例。

def dragMoveEvent(self, event): 
    pos = event.pos() 
    item = self.myTreeWidget.itemAt(pos) 

    # If hovered over an item during drag, set UserRole = 1 
    if item: 
     index = self.myTreeWidget.indexFromItem(item) 
     self.myTreeWidget.model().setData(index, 1, Qt.UserRole) 

    # reset UserRole to 0 for all other indices 
    for i in range(self.myTreeWidget.model().rowCount()): 
     _index = self.myTreeWidget.model().index(i, 0) 
     if not item or index != _index: 
      self.myTreeWidget.model().setData(_index, 0, Qt.UserRole) 


class MyDelegate(QStyledItemDelegate): 

    def paint(self, painter, option, index): 
     QStyledItemDelegate.paint(self, painter, option, index) 
     painter.save() 
     data = index.model().data(index, Qt.UserRole).toInt() 
      # if UserRole = 1 draw custom line 
     if data[1] and data[0] == 1: 
      line = QLine(option.rect.topLeft(), option.rect.topRight()) 
      painter.drawLine(line) 
     painter.restore() 
+1

について、助け

希望は、おそらく標準のレンダリングの一部を上書きする方法を把握しようとしているよりも少ない労力がかかります。 – Apalala

答えて

1

これはQtはC++を使用して簡単に解けるです:あなたはそこに、新しいスタイルを定義drawPrimitiveメソッドをオーバーライドし、カスタムペイントを行う(あるいは単に何もしない)ことができますQStyle :: PE_IndicatorItemViewItemDrop定数が要素パラメータを介して受信されるたびに。以下はその例です:

class TestStyle : public QProxyStyle 
{ 
public: 
    TestStyle(QStyle *baseStyle = 0) : QProxyStyle(baseStyle) {} 

    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const 
    { 
     if (element == QStyle::PE_IndicatorItemViewItemDrop) 
     { 
      //?? do nothing or do custom painting here 
     } 
     else 
     { 
      QProxyStyle::drawPrimitive(element, option, painter, widget); 
     } 
    } 
}; 

.. 

ui->treeView->setStyle(new TestStyle(ui->treeView->style())); 

ここで、pyqtはQProxyStyleについて何も知らないようです。それがラップされていないように見えるので、これを動作させるには、自分でスタイルクラスをラップする必要があります。

別の解決方法は、カスタムQTreeViewの子孫を作成し、そのpaintEventメソッドをオーバーライドすることです。デフォルト実装はdrawTreeとpaintDropIndicatorを呼び出しています。 paintDropIndicatorはドラッグ&ドロップインジケータを担当し、drawTreeはツリー項目をレンダリングします。 drawTreeは保護されており、paintEventから呼び出すことができます。

class TestTreeView : public QTreeView 
{ 
public: 
    explicit TestTreeView(QWidget *parent = 0) : QTreeView(parent) {} 

    void paintEvent(QPaintEvent * event) 
    { 
     QPainter painter(viewport()); 
     drawTree(&painter, event->region()); 
    } 
}; 

デフォルトのドラッグアンドドロップインジケータが表示されないようにする必要があります。あなたがそれをPythonに変換する際に問題がある場合は教えてください。これは(テキストなど)のレンダリングを引き継ぐ

+0

2番目の方法は魅力的に機能し、簡単に愚かでした。ありがとう!! –

関連する問題