在Qt中QGraphicsScene,如果我想要一个项目,只需单击它,然后单击另一个可选项目将使所选项目取消选中.如果我想选择多个项目,我会使用Ctrl键.但是在某些情况下这可能不方便,那么如何在不按Ctrl键的情况下选择多个项目QGraphicsScene?
您想要更改默认行为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如果你不想要默认行为,你也必须处理它.
您的场景必须由a显示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);
}
| 归档时间: | 
 | 
| 查看次数: | 7511 次 | 
| 最近记录: |