我在QGraphicsView中实现了mousePress,mouseMove和mouseRelase,我在其中添加了一个QGraphicsWidget和一个QGraphicsLayoutItem并添加到视图中。
现在我已经实现了
的graphicsLayoutitemvoid 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中鼠标移动时,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事件继续调用。