Как выбрать несколько элементов без нажатия клавиши Ctrl в QGraphicsScene? - PullRequest
4 голосов
/ 28 сентября 2010

В Qt's QGraphicsScene, если я хочу один элемент, просто щелкните по нему, и щелкните другой выбираемый элемент, чтобы сделать выбранный элемент невыбранным.Если я хочу выбрать несколько элементов, я бы использовал клавишу Ctrl.Но это может быть неудобно для некоторых случаев, тогда как выбрать несколько элементов без нажатия клавиши Ctrl в пределах QGraphicsScene?

Ответы [ 2 ]

8 голосов
/ 01 октября 2010

Вы хотите изменить поведение по умолчанию 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);
}
1 голос
/ 03 октября 2013

может быть, это взлом, но это работает для меня. В этом примере вы можете выбрать несколько элементов с помощью клавиши 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);
}
...