Como selecionar vários itens sem pressionar a tecla Ctrl na QGraphicsScene?
-
25-09-2019 - |
Pergunta
Em qt's QGraphicsScene
, se eu quiser um item, basta clicar nele e clicar em outro item selecionável fará com que o item selecionado seja não selecionado. Se eu quiser selecionar vários itens, usaria Ctrl-Key. Mas isso talvez não seja conveniente para alguns casos, como selecionar vários itens sem pressionar Ctrl-Key dentro QGraphicsScene
?
Solução
Você quer mudar o comportamento padrão de QGraphicsScene
, então você tem que criar sua própria aula de cena, herdando QGraphicsScene
.
Na sua classe, você terá que reimplementar pelo menos mousePressEvent
e lidar com a seleção de itens você mesmo.
Aqui está como você pode fazer isso (a aula de cena herdada é chamada 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());
}
Implementando dessa maneira, clicando em um item com selecioná -lo, se ainda não estiver, ou o desastre de outra forma.
Mas tenha cuidado, implemente mousePressEvent
certamente não é suficiente: você terá que lidar com o mouseDoubleClickEvent
Além disso, se você não deseja o comportamento padrão.
Sua cena terá que ser exibida por um QGraphicsView
. Aqui está um exemplo de visão de criação de sua própria cena (MainFrm
A classe está herdando 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);
}
Outras dicas
Talvez seja um hack, mas funciona para mim. Neste exemplo, você pode selecionar vários itens usando a tecla 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);
}