2

我已经在 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 事件将继续调用。

4

0 回答 0