QTREEWIDGET子分类,停止下降指示器显示给定有不必要的DropIndicatorPosition

QTreeWidget sub classing, stop drop indicator from showing given unwanted dropIndicatorPosition

本文关键字:显示 不必要 DropIndicatorPosition 指示器 分类 QTREEWIDGET      更新时间:2023-10-16

我有以下问题。当我不想完成Drop事件时,我需要阻止Drop指示器出现,这是在DropIndIcatorPosition((返回QAbstractItemView::BelowItemQAbstractItemView::AboveItem上的条件。现在,我子类QTreeWidget,并具有以下dropEvent的实现。

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);
}

我想这样做,以停止视觉指示,表明出现任何下降都可能发生。我只希望在黑线之间出现。我已经尝试重新实现dragMoveEvent,但是通过:

动态设置下降指示器
DropIndicatorPosition position = dropIndicatorPosition();
setDropIndicatorShown(!(position != QAbstractItemView::BelowItem && position != QAbstractItemView::AboveItem));

实际上什么也没做,我希望某种方法不必以每种方式执行逻辑。

看来我抓住了你想要的东西。我以前的答案仅适用于列表。

要防止文件夹周围的绘画盒,您可以使用类似的东西:

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();
    }
}

但我不明白你为什么需要那个奇怪的事情。

您应该覆盖QAbstractItemModel::flags,然后将Qt::ItemIsDropEnabled标志添加到可以用作Drop目标的项目中。