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);
}
- 1. Configurer ListBox dans WPF afin que je puisse sélectionner plusieurs éléments sans tenir la touche CTRL
- 2. Sélectionnez plusieurs lignes sans appuyer sur la touche de commande
- 3. Ctrl-Espace dans Eclipse sans appuyer sur Ctrl-Espace
- 4. appuyer sur la touche ALT dans CMainFrame
- 5. Activer Intellisense IPhone sans appuyer sur la touche Echap
- 6. nouveau nœud sur appuyer sur la touche dans TreeView
- 7. obtenir la valeur appuyer sur la touche
- 8. .NET 3.5 GridView - Sélectionnez plusieurs lignes avec la touche Ctrl appuyez sur
- 9. get modifierFlags dans l'événement keyDown sans appuyer sur la touche non-modifiable avec elle!
- 10. jquery émuler la touche "ctrl + +"
- 11. Désactiver soumettre à l'événement appuyer sur la touche
- 12. Émulation « supprimer »-appuyer sur la touche de menu contextuel
- 13. Détecter double touche Ctrl dans JS
- 14. Dans LINQ, puis-je sélectionner plusieurs éléments?
- 15. Simuler la touche de tabulation Appuyer sur iOS SDK
- 16. événement Capture appuyer sur la touche à l'aide NSNotificationCenter
- 17. Cliquez sur HyperLinks dans un RichTextBox sans maintenir CTRL - WPF
- 18. Sélection de lignes gridview à l'aide de la touche ctrl
- 19. J'ai un masque d'éditeur en flash qui affiche son mouvement sans appuyer sur la touche entrée
- 20. Utilisez jquery pour sélectionner plusieurs éléments dans une liste d'éléments sans utiliser la case à cocher
- 21. Pouvez-vous distinguer entre la touche CTRL gauche et la touche CTRL droite en utilisant les codes-clés dans .keypress()?
- 22. Détection de la touche ctrl + tab
- 23. raw_input en python sans appuyer sur enter
- 24. Texte dans un QGraphicsScene
- 25. C# capture Ctrl + Page touche
- 26. Interception de la touche Nokia Ctrl/Chr en appuyant sur
- 27. MarkItUp! actualisation de l'aperçu continu sans appuyer sur Entrée
- 28. Appuyez sur la touche de capture sans placer un élément d'entrée sur la page?
- 29. Comment dessiner une ellipse/cercle sur QGraphicsScene dans un QGraphicsView
- 30. jQuery UI plusieurs sélections
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