Qt de QGraphicsScene
, si je veux un article, cliquez dessus, puis cliquez sur un autre élément pouvant être sélectionné fera l'élément sélectionné doit être désélectionné. Si je veux sélectionner plusieurs éléments, j'utiliserais la touche Ctrl. Mais ce n'est peut-être pas pratique dans certains cas, puis comment sélectionner plusieurs éléments sans appuyer sur la touche Ctrl au sein de QGraphicsScene
?Comment sélectionner plusieurs éléments sans appuyer sur la touche Ctrl dans QGraphicsScene? Dans
Répondre
Vous souhaitez modifier le comportement par défaut de QGraphicsScene
, vous devez donc créer votre propre classe de scène, héritant QGraphicsScene
.
Dans votre classe, vous aurez à réimplémenter au moins mousePressEvent
et gérer la sélection de produit vous-même.
Voici comment vous pouvez le faire (la classe de scène héritée est appelée 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());
}
La mise en œuvre de cette façon, en cliquant sur un élément avec sélection si elle est pas déjà, ou désélectionnera autrement .
Mais attention, mettre en œuvre mousePressEvent
est certainement pas suffisant: vous devrez gérer le mouseDoubleClickEvent
aussi bien si vous ne voulez pas le comportement par défaut.
Votre scène devra être affichée par un QGraphicsView
. Voici un exemple d'une vue créer sa propre scène (MainFrm
classe hérite 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);
}
Merci beaucoup! J'ai copié votre code et fait de légères modifications, cela fonctionne dans mon programme. – moligaloo
est peut-être un hack mais il est fonctionne pour moi. Dans cet exemple, vous pouvez sélectionner plusieurs éléments à l'aide de la touche Maj.
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);
}
De quelle façon souhaitez-vous sélectionner plusieurs éléments? Faire glisser un rectangle autour, en cliquant dans un délai? Précisez ce que vous voulez s'il vous plaît. – Live
Si je veux choisir A et B, je dois cliquer sur A, puis en appuyant sur la touche Ctrl, puis cliquez sur B par défaut. Je voudrais sélectionner plusieurs éléments de cette manière: il suffit de cliquer sur A, puis sur B, A et B seront sélectionnés. – moligaloo
Vous auriez réimplémenter QGraphicsScene vide :: mousePressEvent (QGraphicsSceneMouseEvent * mouseEvent) [protected], mais je ne peux pas précise exactement comment. – Live