Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取拖动的源&;QTreeWidget中的drop操作_C++_Qt_Drag_Treewidget - Fatal编程技术网

C++ 如何获取拖动的源&;QTreeWidget中的drop操作

C++ 如何获取拖动的源&;QTreeWidget中的drop操作,c++,qt,drag,treewidget,C++,Qt,Drag,Treewidget,(对不起我的英语) 我目前正在尝试在QTreeWidget中进行拖放。因此,我将相应的设置和方法放置在dropEvent中: class TreeWidget : public QTreeWidget { protected: virtual void dropEvent(QDropEvent *event) override { QModelIndex index = indexAt(event->pos()); if (!index.isValid()) {

(对不起我的英语)

我目前正在尝试在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);
}
classtreewidget:publicqtreewidget
{
受保护的:
虚拟void dropEvent(QDropEvent*事件)重写
{
QModelIndex index=indexAt(事件->位置());
如果(!index.isValid()){//以防万一
事件->setDropAction(Qt::IgnoreAction);
返回;
}
QTreeWidgetItem*item=itemFromIndex(索引);
qDebug()setSelectionMode(QAbstractItemView::SingleSelection);
listWidget->setDragEnabled(真);
listWidget->viewport()->setAcceptDrops(真);
listWidget->setDropIndicatorShown(真);
listWidget->setDragDropMode(QAbstractItemView::InternalMove);
}
但在我的例子中,我只想移动父项。在代码中,我得到了目标项,但是如何得到拖动项

我必须重载拖动方法吗?从mousePressEvent启动拖动?最好的方法是什么


谢谢!

您可以通过以下方式获得拖动的项目:

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

之后,您可以尝试使用将其转换为更特定的Qt类,即
QTreeWidget
。如果对象不是从请求的类派生的,则将返回
0

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


不幸的是,QTreeWidget项不是从QObject派生的。我们建议使用QTreeWidget::currentItem()获取移动的元素。它不使用QDropent参数,但似乎可以工作。
QObject
source是一个
QTreeWidget
。因此,您可以从源
QTreeWidget
@Maluna34请求
currentItem
,您应该以任何方式检查源代码。否则,您可以接受来自任何源代码的drop事件它将作为您的树的移动项目!