您希望更改
QGraphicsScene
的默认行为,因此您需要创建自己的场景类,继承
QGraphicsScene
。
在您的类中,您必须重新实现至少
mousePressEvent
并自己处理项目选择。
以下是您可以执行此操作的方法(继承的场景类称为
GraphicsSelectionScene
):
void GraphicsSelectionScene::mousePressEvent(QGraphicsSceneMouseEvent* pMouseEvent) {
QGraphicsItem* pItemUnderMouse = itemAt(pMouseEvent->scenePos().x(), pMouseEvent->scenePos().y());
if (!pItemUnderMouse)
return;
if (pItemUnderMouse->isEnabled() &&
pItemUnderMouse->flags() & QGraphicsItem::ItemIsSelectable)
pItemUnderMouse->setSelected(!pItemUnderMouse->isSelected());
}
实现这种方式,如果项目尚未选定,则单击该项目将选择它,否则将取消选择。
但要小心,仅实现
mousePressEvent
是不够的:如果您不想使用默认行为,则还必须处理
mouseDoubleClickEvent
。
您的场景必须由
QGraphicsView
显示。以下是一个视图创建自己的场景的示例(
MainFrm
类继承了
QGraphicsView
):
#include "mainfrm.h"
#include "ui_mainfrm.h"
#include "graphicsselectionscene.h"
#include <QGraphicsItem>
MainFrm::MainFrm(QWidget *parent) : QGraphicsView(parent), ui(new Ui::MainFrm) {
ui->setupUi(this);
QGraphicsScene* pScene = new GraphicsSelectionScene(this);
this->setScene(pScene);
QGraphicsItem* pRect1 = pScene->addRect(10,10,50,50, QColor(Qt::red), QBrush(Qt::blue));
QGraphicsItem* pRect2 = pScene->addRect(100,-10,50,50);
QGraphicsItem* pRect3 = pScene->addRect(-200,-30,50,50);
pRect1->setFlag(QGraphicsItem::ItemIsSelectable, true);
pRect2->setFlag(QGraphicsItem::ItemIsSelectable, true);
pRect3->setFlag(QGraphicsItem::ItemIsSelectable, true);
}