在 Qt 中QGraphicsScene
,如果我想要一个项目,只需单击它,然后单击另一个可选择的项目将使所选项目被取消选择。如果我想选择多个项目,我会使用 Ctrl 键。但这在某些情况下可能不方便,那么如何在不按 Ctrl 键的情况下选择多个项目QGraphicsScene
呢?
问问题
8338 次
2 回答
8
您想更改 的默认行为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);
// Create a scene with our own selection behavior
QGraphicsScene* pScene = new GraphicsSelectionScene(this);
this->setScene(pScene);
// Create a few items for testing
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);
// Make sure the items are selectable
pRect1->setFlag(QGraphicsItem::ItemIsSelectable, true);
pRect2->setFlag(QGraphicsItem::ItemIsSelectable, true);
pRect3->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
于 2010-10-01T12:28:31.350 回答
2
也许这是一个黑客,但它对我有用。在此示例中,您可以使用 shift 键选择多个项目
void MySceneView::mousePressEvent(QMouseEvent *event)
{
if (event->modifiers() & Qt::ShiftModifier ) //any other condition
event->setModifiers(Qt::ControlModifier);
QGraphicsView::mousePressEvent(event);
}
void MySceneView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->modifiers() & Qt::ShiftModifier ) //any other condition
event->setModifiers(Qt::ControlModifier);
QGraphicsView::mouseReleaseEvent(event);
}
于 2013-10-03T15:02:58.300 回答