Cómo seleccionar varios elementos sin pulsar tecla Ctrl dentro QGraphicsScene?
-
25-09-2019 - |
Pregunta
En QGraphicsScene
de Qt, si quiero un artículo, simplemente haga clic en él y haga clic en otro elemento seleccionable hará que el elemento seleccionado para ser seleccionada. Si quiero seleccionar varios elementos, que haría uso oprimida la tecla CTRL. Pero esto quizá no es conveniente para algunos casos, a continuación, cómo seleccionar varios elementos, sin presionar Ctrl-clave dentro QGraphicsScene
?
Solución
desea cambiar el comportamiento predeterminado de QGraphicsScene
, por lo que tiene que crear su propia clase de escena, heredando QGraphicsScene
.
En su clase, tendrá que volver a implementar al menos mousePressEvent
y manejar la selección de elementos de sí mismo.
Esta es la forma en que podría hacerlo (la clase heredada escena se llama 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());
}
La implementación de esta manera, al hacer clic en un elemento con seleccionarla, si no lo está ya, o va a anular la selección de otra manera.
Pero cuidado, aplicar mousePressEvent
es ciertamente no es suficiente:. Usted tiene que manejar los mouseDoubleClickEvent
as bien si no desea que el comportamiento por defecto
Su escena tendrá que ser visualizado por un QGraphicsView
. He aquí un ejemplo de una vista crear su propio (MainFrm
clase QGraphicsView
está heredando) escena:
#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);
}
Otros consejos
tal vez es un truco, pero es que funciona para mí. En este ejemplo, puede seleccionar varios elementos, utilizando tecla de mayúsculas
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);
}