将项目从QTreeWidget拖动到QGraphicsView

问题描述 投票:0回答:1

我有以下情况:

Example

基本上,我有一个带有某些项目的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事件?
  • 如何通过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() {

}
c++ qt drag-and-drop qgraphicsview qtreewidget
1个回答
1
投票

文档对DragMoveEvent说以下内容:

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

因此,您应该提供dragMoveEvent(QDragMoveEvent* event)的替代,您只需接受建议的操作即可。

© www.soinside.com 2019 - 2024. All rights reserved.