QGraphicsScene/QGraphicsView如何实现鼠标右键选中物体?

默认是鼠标左键按下,可以选择物体。那怎么实现右键按下也能选中物体?

我们可以通过QGraphicsScene的函数itemAt(),并且带入鼠标当前的坐标来获取Item。

1、在QGraphicsScene继承类里实现

class CadScene : public QGraphicsScene
{
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;

signals:
    void sigPopupMenu(void);
}

void CadScene::mousePressEvent(QGraphicsSceneMouseEvent *event) //QGraphicsScene比QGraphicsView优先执行鼠标动作
{
    this->clearSelection();
    QTransform transform;
    QGraphicsItem *item = this->itemAt(event->scenePos(), transform);
    if (item)
    {
        item->setSelected(true);
    }

    emit sigPopupMenu();
    QGraphicsScene::mousePressEvent(event);
}

2、在QGraphicsView继承类里实现

(1)先在view得到鼠标右键弹出的坐标,发出信号

class CADVIEW_API CadView : public QGraphicsView
{
protected:
    virtual void contextMenuEvent(QContextMenuEvent *event) override;

signals:
    void sigPopupMenu(const QPoint &);
}

void CadView::contextMenuEvent(QContextMenuEvent *event) //右键菜单
{
    m_bMousePress = false;

    QPoint point = event->pos();
    emit sigPopupMenu(point);
}

(2)在信号接收的Widget实现它

void CxxWidget::slotPopupMenu(const QPoint &point) //右键菜单
{
    QGraphicsScene *scene = ui->graphicsView->scene();
    scene->clearSelection();

    QPointF pointScene = ui->graphicsView->mapToScene(point);                       //转换到Scene坐标
    QGraphicsItem *item = scene->itemAt(pointScene, ui->graphicsView->transform()); //获取光标下的绘图项
    if (item)
    {
        item->setSelected(true);
        m_pItemSelect = qgraphicsitem_cast<GraphicsBaseItem *>(item);
    }
    else
    {
        m_pItemSelect = nullptr;
    }

    if (m_pItemSelect)
    {
        if (!m_pPopupMenu)
        {
            return;
        }

        m_pPopupMenu->move(this->cursor().pos()); //让菜单显示的位置在鼠标的坐标上
        m_pPopupMenu->show();
    }
}

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/125001556
今日推荐