كيفية تحديد عناصر متعددة دون الضغط على مفتاح CTRL داخل QGraphicsScene؟
-
25-09-2019 - |
سؤال
في QT QGraphicsScene
, ، إذا أردت عنصرًا واحدًا ، فقط انقر فوقه ، وانقر فوق عنصر آخر يمكن تحديده ، فسيجعل العنصر المحدد غير محدد. إذا كنت أرغب في تحديد عناصر متعددة ، فسأستخدم Ctrl-Key. ولكن ربما لا يكون هذا مناسبًا لبعض الحالات ، ثم كيفية تحديد عناصر متعددة دون الضغط على مفتاح CTRL QGraphicsScene
?
المحلول
تريد تغيير السلوك الافتراضي لـ QGraphicsScene
, ، لذلك عليك إنشاء فصل المشهد الخاص بك ، وراثيا QGraphicsScene
.
في صفك ، يجب عليك إعادة التنفيذ على الأقل 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
. فيما يلي مثال على عرض إنشاء مشهد خاص به (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);
}
نصائح أخرى
ربما يكون اختراقًا ولكنه يعمل بالنسبة لي. في هذا المثال ، يمكنك تحديد عناصر متعددة باستخدام مفتاح 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);
}