我已经在 QGraphicsView 中实现了 mousePress、mouseMove 和 mouseRelase,并且在其中添加了 QGraphicsWidget 和 QGraphicsLayoutItem 并添加到视图中。
现在在我已经实现的 graphicsLayoutitem 里面
void ParentItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
m_mousePressed = true;
QGraphicsObject::mousePressEvent(event);
}
void ParentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (!(event->buttons() & Qt::LeftButton))
{
QGraphicsObject::mouseMoveEvent(event);
return;
}
if( this->boundingRect().contains(event->pos()) && (m_mousePressed))
{
QGraphicsObject::mouseMoveEvent(event);
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
// mime stuff
mimeData->setText("Parent");
drag->setPixmap(m_currentImage.scaled(30,30));
drag->setHotSpot(QPoint(15, 20));
drag->setMimeData(mimeData);
// start drag
drag->start(Qt::CopyAction | Qt::MoveAction);
}
因此,当我在 parentitem 中使用 mouseMove 时,Drag 已成功执行,当我将项目放到场景中时,graphicsView 没有获得 mouseRelease 事件。当我将 graphicsview mouseRelease 事件放到场景中时,它不会被调用。
这就是我处理场景下降的方式
void HandlerScene::dropEvent ( QGraphicsSceneDragDropEvent * event )
{
if (event->mimeData()->hasText()){
if(event->mimeData()->text() == "Parent")
{
//My code
}
event->acceptProposedAction();
}
我在 http://filesave.me/file/53135/DropItem-zip.html中上传的示例代码
您可以拖放项目,它将创建一个新项目。它工作正常,但是当我将 setFocus(Qt::mouseFocusReason) 给项目时,实际问题就开始了。
用户双击该项目的文本,我在其顶部添加了一个 Qgraphicstextitem。当 textitem 失去焦点时,我会删除它。
在正常情况下,无需双击项目文本,拖放工作正常。
但是当我在项目顶部添加 QGraphicsTextItem 并将焦点设置为 setFocus(Qt::mouseFocusReason) 并且如果我再次拖动项目 QGraphicsView mouseMove 事件将继续调用。