Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

64 wiersze
1.6 KiB

  1. #include "mygraphicsview.h"
  2. #include <QMimeData>
  3. #include <QCursor>
  4. #include <QGraphicsScene>
  5. #include <QDebug>
  6. MyGraphicsView::MyGraphicsView(QWidget *parent)
  7. : QGraphicsView(parent)
  8. {
  9. setAcceptDrops(true);
  10. viewport()->setAcceptDrops(true);
  11. setRenderHint(QPainter::Antialiasing);
  12. setFocusPolicy(Qt::StrongFocus); // 让view能接收键盘事件
  13. }
  14. void MyGraphicsView::dragEnterEvent(QDragEnterEvent *event)
  15. {
  16. if (event->mimeData()->hasFormat("application/x-component"))
  17. event->acceptProposedAction();
  18. else
  19. event->ignore();
  20. }
  21. void MyGraphicsView::dragMoveEvent(QDragMoveEvent *event)
  22. {
  23. if (event->mimeData()->hasFormat("application/x-component"))
  24. event->acceptProposedAction();
  25. else
  26. event->ignore();
  27. }
  28. void MyGraphicsView::dropEvent(QDropEvent *event)
  29. {
  30. if (!event->mimeData()->hasFormat("application/x-component")) {
  31. event->ignore();
  32. return;
  33. }
  34. QString type = QString::fromUtf8(event->mimeData()->data("application/x-component"));
  35. QPointF scenePos = mapToScene(event->pos());
  36. Item *item = new Item(type);
  37. item->setPos(scenePos);
  38. if (scene())
  39. scene()->addItem(item);
  40. event->acceptProposedAction();
  41. }
  42. void MyGraphicsView::keyPressEvent(QKeyEvent *event)
  43. {
  44. if (event->key() == Qt::Key_Delete && scene()) {
  45. // 删除所有被选中的图元
  46. QList<QGraphicsItem*> selectedItems = scene()->selectedItems();
  47. for (QGraphicsItem* item : selectedItems) {
  48. scene()->removeItem(item);
  49. delete item;
  50. }
  51. } else {
  52. QGraphicsView::keyPressEvent(event);
  53. }
  54. }