2010-09-28 6 views
4

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

+0

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

+0

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

+0

Vous auriez réimplémenter QGraphicsScene vide :: mousePressEvent (QGraphicsSceneMouseEvent * mouseEvent) [protected], mais je ne peux pas précise exactement comment. – Live

Répondre

8

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); 
} 
+0

Merci beaucoup! J'ai copié votre code et fait de légères modifications, cela fonctionne dans mon programme. – moligaloo

0

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); 
} 
Questions connexes