Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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拖动到QGraphicsView_C++_Qt_Drag And Drop_Qgraphicsview_Qtreewidget - Fatal编程技术网

C++ 将项目从QTreeWidget拖动到QGraphicsView

C++ 将项目从QTreeWidget拖动到QGraphicsView,c++,qt,drag-and-drop,qgraphicsview,qtreewidget,C++,Qt,Drag And Drop,Qgraphicsview,Qtreewidget,我有以下情况: 基本上,我有一个带有一些项目的QTreeWidget,还有一个画布,它是QGraphicsView的子类。我想要完成的是在QGraphicsView子类中拖动qtreewightitem。当鼠标在QGraphicsView子类中释放时,我想创建一个新形状(比如说一个圆),其中包含拖动项目的一些数据(比如说名称本身写在圆内) 我能够使用setDrageEnabled(true)方法从QTreeWidget启用拖动,并且我能够在QGraphicsView中接收事件,因为当我进入其区

我有以下情况:

基本上,我有一个带有一些项目的
QTreeWidget
,还有一个画布,它是
QGraphicsView
的子类。我想要完成的是在
QGraphicsView
子类中拖动
qtreewightitem
。当鼠标在
QGraphicsView
子类中释放时,我想创建一个新形状(比如说一个圆),其中包含拖动项目的一些数据(比如说名称本身写在圆内)

我能够使用
setDrageEnabled(true)
方法从
QTreeWidget
启用拖动,并且我能够在
QGraphicsView
中接收事件,因为当我进入其区域时,它调用
dragEnterEvent

在我的子类中,我有一个
qgraphicscene
,如下所示:

#ifndef SEQUENCECANVAS_HPP_
#define SEQUENCECANVAS_HPP_

#include <QWidget>
#include <QGraphicsScene>
#include <QGraphicsView>

class SequenceCanvas : public QGraphicsView {

  Q_OBJECT

public:

  SequenceCanvas(QWidget* parent = nullptr);
  virtual ~SequenceCanvas() = default;

protected:

  void dragEnterEvent(QDragEnterEvent* event) override;
  void dropEvent(QDropEvent* event) override;

private:

  void createWidgets();
  void createLayout();

private:

  QGraphicsScene m_scene;
};

#endif // !SEQUENCECANVAS_HPP_

文件说明了以下内容:

如果小部件接受拖放事件并输入事件,则当拖动在其边界内时,它将重复接收拖放事件。小部件应该检查事件以查看它提供的数据类型,并在适当的情况下调用accept()函数来接受删除


因此,您应该为
dragmovevent(qdragmovevent*event)
提供一个覆盖,在该覆盖中,您只需接受建议的操作。

小部件上的acceptDrops设置为true吗?我调用
setAcceptDrops(true)序列图
构造函数中的code>。如果我在它之后调用
acceptDrops()
,它将返回
true
。哎呀,错过了文档对DragMoveEvent的描述(值得一试,只要接受该操作):如果小部件接受拖放事件并输入事件,它将在拖动处于其边界内时重复接收拖动移动事件。小部件应该检查事件以查看它提供的数据类型,并在适当的情况下调用accept()函数来接受拖放。我怀疑拖放事件需要由视口而不是
QGraphicsView
本身来处理。尝试在“视口”小部件上安装事件过滤器,或设置自己的自定义视口小部件来处理相关事件。
#include "SequenceCanvas.hpp"
#include <QString>
#include <QHBoxLayout>
#include <QDragEnterEvent>
#include <QMimeData>

SequenceCanvas::SequenceCanvas(QWidget* parent) :
  QGraphicsView(parent) {
  createWidgets();
  createLayout();
  setScene(&m_scene);
  setAcceptDrops(true);
}

void SequenceCanvas::dragEnterEvent(QDragEnterEvent* event) {
  event->acceptProposedAction(); // no filter at the moment I just want to test
}

void SequenceCanvas::dropEvent(QDropEvent* event) {
  int i = 0; // just for putting a breakpoint now. Its breakpoint is never raised
}

void SequenceCanvas::createWidgets() {

}

void SequenceCanvas::createLayout() {

}

SequenceCanvas::SequenceCanvas(QWidget* parent) :
  QGraphicsView(parent) {
  createWidgets();
  createLayout();
  setScene(&m_scene);
  setAcceptDrops(true);
  bool ok = acceptDrops();
}

///////////////////////////////////////////////////////////////////////////////
// VIRTUAL PROTECTED SECTION                                                 //
///////////////////////////////////////////////////////////////////////////////

void SequenceCanvas::dragEnterEvent(QDragEnterEvent* event) {
  event->acceptProposedAction();
}

void SequenceCanvas::dragMoveEvent(QDragMoveEvent* event) {
  event->acceptProposedAction();
}

void SequenceCanvas::dropEvent(QDropEvent* event) {
  int i = 0;
}

///////////////////////////////////////////////////////////////////////////////
// PRIVATE SECTION                                                           //
///////////////////////////////////////////////////////////////////////////////

void SequenceCanvas::createWidgets() {

}

void SequenceCanvas::createLayout() {

}