Cómo seleccionar varios elementos sin pulsar tecla Ctrl dentro QGraphicsScene?

StackOverflow https://stackoverflow.com/questions/3810245

  •  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?

¿Fue útil?

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 mouseDoubleClickEventas 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top