2017-06-07 7 views
0

次の問題があります。 dropIndicatorPosition()の条件付きで、QAbstractItemView::BelowItemまたはQAbstractItemView::AboveItemのいずれかを返すドロップイベントを完了しない場合、ドロップインジケーターが表示されないようにする必要があります。今私はQTreeWidgetをサブクラス化し、dropEventの次の実装を持っています。QTreeWidgetサブクラス化、指定した不要なdropIndicatorPositionのドロップインジケータの表示を停止

void SubClassedQTreeWidget::dropEvent(QDropEvent *event) { 
    DropIndicatorPosition position = dropIndicatorPosition(); 
    if(position != QAbstractItemView::BelowItem && position != QAbstractItemView::AboveItem){ 
     // exit since we don't care for other types of drop events 
     return; 
    } 
    QTreeWidget::dropEvent(event); 
} 

これは、ドロップが発生する可能性があることを視覚的に知らせるためです。私は間に黒い線が現れて欲しい。実際に何もしない、と私はいくつかの方法がどのような方法をドラッグして、すべてのロジックを実行する必要がないことを期待する

DropIndicatorPosition position = dropIndicatorPosition(); 
setDropIndicatorShown(!(position != QAbstractItemView::BelowItem && position != QAbstractItemView::AboveItem)); 

:私は、しかしを通じて動的にドロップインジケーターを設定し、再実装dragMoveEventを試してみました。

+0

['showDropIndicator'](http://doc.qt.io/qt-5/qabstractitemview.html#showDropIndicator-prop)プロパティは、探しているプロパティですか?ただ単にそれを 'true'または' false'に設定してください。 –

+0

@ G.M。ポスト全体を必ず読んでください。 'setDropIndicatorPosition'はこれを行います。ご覧のとおり、' dragMoveEvent'の内部では動作しません。私はそれが何もしないか、または論理を委任されていないすべてのドロップインジケータをオフにするように指定するべきです。 – snb

答えて

1

私はあなたが欲しいものをキャッチするようです。私の以前の答えはリストにのみ適しています。

void TreeView::paintEvent(QPaintEvent * event) 
{ 
    DropIndicatorPosition position = dropIndicatorPosition(); 
    setDropIndicatorShown(position == QAbstractItemView::BelowItem || position == QAbstractItemView::AboveItem); 
    base_t::paintEvent(event); 
    setDropIndicatorShown(true); 
} 

そして、それらの上に落下防止の(そしてしばらくその上禁止されたカーソルをペイント)するために:あなたはこのようなものを使用することができ、フォルダの周りに絵箱を防止するために

void TreeView::dragMoveEvent(QDragMoveEvent * event) 
{ 
    base_t::dragMoveEvent(event); 
    DropIndicatorPosition position = dropIndicatorPosition(); 
    if (position != QAbstractItemView::BelowItem && position != QAbstractItemView::AboveItem) { 
     event->ignore(); 
    } 
} 

しかし、私その奇妙なことがなぜ必要なのか理解していない。

+0

これはDragMoveEventでは使用できません(以前これを試したものですが)。 – snb

+0

ペイントイベントのみを使用すると、フォルダの周りのボックスは描画されませんが、引き続きアイテムをドロップできます。それを防止するために、ドラッグ・ムーブ・イベントも使用します。 – olya

+0

私はすでにこの問題を解決する前にこの問題を解決していましたが、パフォーマンス上の理由からドラッグ移動イベントを使用したくない場合は、 'dropEvent' – snb

0

ドロップターゲットとして使用できるアイテムには、QAbstractItemModel::flagsを上書きし、Qt::ItemIsDropEnabledフラグを追加する必要があります。

+0

アイテムのどれもドロップターゲットにすることはできません。これは並べ替えではありません。ウィジェットの間に配置するときに表示されるドロップインジケータのみを指定したい(上または下の場合のみ)。あなたのソリューションはそれをまったく手助けしません。 – snb

+0

あなたがリストだけを持っていて、既存のものの間に新しいアイテムを挿入したいなら、 'return index.isValid()? Qt :: ItemIsSelectable | Qt :: ItemIsEnabled:Qt :: ItemIsDropEnabled; 'オーバーロードされた' QAbstractItemModel :: flags'メソッド – olya

+0

'QTreeWidget'は' QAbstractItemModel'から継承しないので、その関数を使用することはできません。 – snb

関連する問題