gpt4 book ai didi

qt - 如何在QGraphicsScene中不按Ctrl键选择多个项目?

转载 作者:行者123 更新时间:2023-12-04 13:15:22 51 4
gpt4 key购买 nike

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

最佳答案

您想更改 QGraphicsScene 的默认行为,所以你必须创建自己的场景类,继承QGraphicsScene .

在您的类(class)中,您必须至少重新实现 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 显示.这是创建自己场景的 View 示例( 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);
}

关于qt - 如何在QGraphicsScene中不按Ctrl键选择多个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810245/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com