我有以下情况:
基本上,我有一个带有某些项目的QTreeWidget
和一个画布,它是QGraphicsView
的子类。我要完成的是将QTreeWidgetItem
拖到QGraphicsView
子类中。当在QGraphicsView
子类中释放鼠标时,我想使用拖动的项目的某些数据(例如名称本身写在圆圈内)创建一个新形状(例如一个圆圈)。
我能够使用QTreeWidget
方法启用从setDragEnabled(true)
进行拖动,并且能够在QGraphicsView
中接收事件,因为当我进入其区域时,它将调用dragEnterEvent
。
在我的子类中,我有一个QGraphicsScene
,如下所示:
#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_
#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() {
}
即使在拖动过程中当鼠标进入窗口小部件时调用了dragEnterEvent
,也不会调用dropEvent
方法,因此,当我在SequenceCanvas
类中释放鼠标时,什么也不会发生。
基本上我有两个问题:
SequenceCanvas
的子类QGraphicsView
类中引发drop事件?编辑:
我想重新实现void dragMoveEvent(QDragMoveEvent* event)
方法。我已添加它,现在收到放置事件。我现在需要知道如何通过拖放事件传递自定义数据...感谢zeFrenchy。
我的班级现在是:
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() {
}
文档对DragMoveEvent说以下内容:
如果小部件接受放置事件并输入事件,则当其在其边界之内时,小部件将反复接收拖动事件。小部件应检查事件以查看其提供的数据类型,并在适当的情况下调用accept()函数以接受放置。
因此,您应该提供dragMoveEvent(QDragMoveEvent* event)
的替代,您只需接受建议的操作即可。