1

(对不起我的英语不好)

我目前正在尝试在 QTreeWidget 中进行拖放。所以我把相应的设置和方法 dropEvent :

class TreeWidget : public QTreeWidget
{
protected:

  virtual void dropEvent(QDropEvent *event) override
  {
    QModelIndex index = indexAt(event->pos());
    if (!index.isValid()) {  // just in case
      event->setDropAction(Qt::IgnoreAction);
      return;
    }

    QTreeWidgetItem* item = itemFromIndex(index);
    qDebug() << "drop on item" << item->text(0);

    QTreeWidget::dropEvent(event);
  }
};

int main()
{
  TreeWidget *listWidget = new TreeWidget;
  listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  listWidget->setDragEnabled(true);
  listWidget->viewport()->setAcceptDrops(true);
  listWidget->setDropIndicatorShown(true);
  listWidget->setDragDropMode(QAbstractItemView::InternalMove);
}

但就我而言,我只想移动父项。在代码中,我得到了目标项目,但如何得到拖动项目?

我是否要重载拖动方法?从 mousePressEvent 自己启动拖动?最好的方法是什么?

谢谢 !

4

1 回答 1

1

您可以通过以下方式获取拖动的项目QDropEvent::source

如果拖动操作的源是此应用程序中的小部件,则此函数返回该源;否则返回 0。

之后您可以尝试将其转换为更具体的 Qt 类,即QTreeWidget使用qobject_cast. 如果对象不是从请求的类派生的,0将返回:

如果对象是 T 类型(或子类),则返回给定对象强制转换为 T 类型;否则返回 0。如果对象为 0,那么它也将返回 0。

于 2017-06-27T15:31:08.567 回答