【问题标题】:How to select multiple items without pressing Ctrl key within QGraphicsScene?如何在 QGraphicsScene 中选择多个项目而不按 Ctrl 键?
【发布时间】:2010-09-28 06:34:45
【问题描述】:

在Qt的QGraphicsScene中,如果我想要一个项目,只需单击它,然后单击另一个可选择的项目将使已选择的项目被取消选择。如果我想选择多个项目,我会使用 Ctrl 键。但这在某些情况下可能不方便,那么如何在QGraphicsScene 中不按Ctrl 键来选择多个项目呢?

【问题讨论】:

  • 您想以什么方式选择多个项目?拖动一个矩形,在时间延迟内单击?请准确地说出你想要的。
  • 如果我要选择A和B,我必须点击A,然后按Ctrl键,然后默认点击B。我想这样选择多个项目:只需点击A,然后点击B,A和B都会被选中。
  • 您必须重新实现 void QGraphicsScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) [protected],但我无法准确说明。
  • 还是谢谢大家,我已经解决了
  • 如果您能提供一个更新说明您是如何解决它的,那就太好了,这样如果其他有此问题的用户发现此问题,他们将从您的经验中受益。

标签: qt qgraphicsview


【解决方案1】:

你想改变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);
}

【讨论】:

  • 非常感谢!我复制了您的代码并进行了一些细微的更改,这在我的程序中有效。
【解决方案2】:

也许这是一个 hack,但它对我有用。在此示例中,您可以使用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2018-11-30
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多