默认是鼠标左键按下,可以选择物体。那怎么实现右键按下也能选中物体?
我们可以通过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();
}
}