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