You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.1 KiB

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "item.h"
  4. #include <QListWidgetItem>
  5. #include <QMimeData>
  6. #include <QDrag>
  7. #include <QPainter>
  8. #include <QMouseEvent>
  9. #include <QDropEvent>
  10. #include <QGraphicsView>
  11. MainWindow::MainWindow(QWidget *parent)
  12. : QMainWindow(parent)
  13. , ui(new Ui::MainWindow)
  14. {
  15. ui->setupUi(this);
  16. /* 1. 场景 */
  17. m_scene = new QGraphicsScene(this);
  18. ui->graphicsView->setScene(m_scene);
  19. ui->graphicsView->setSceneRect(0, 0, 800, 600);
  20. ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
  21. /* 2. 列表 */
  22. ui->listWidget->setViewMode(QListView::IconMode);
  23. ui->listWidget->setIconSize(QSize(60, 30));
  24. ui->listWidget->setDragEnabled(false);
  25. ui->listWidget->viewport()->installEventFilter(this);
  26. /* 3. 填充列表 */
  27. createComponents();
  28. }
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }
  33. /* ---------- 拖拽核心 ---------- */
  34. bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  35. {
  36. if (obj == ui->listWidget->viewport()) {
  37. static QListWidgetItem *dragItem = nullptr;
  38. static QPoint startPos;
  39. if (event->type() == QEvent::MouseButtonPress) {
  40. auto *me = static_cast<QMouseEvent*>(event);
  41. if (me->button() == Qt::LeftButton) {
  42. dragItem = ui->listWidget->itemAt(me->pos());
  43. startPos = me->pos();
  44. }
  45. } else if (event->type() == QEvent::MouseMove && dragItem) {
  46. auto *me = static_cast<QMouseEvent*>(event);
  47. if ((me->pos() - startPos).manhattanLength()
  48. >= QApplication::startDragDistance()) {
  49. QString type = dragItem->data(Qt::UserRole).toString();
  50. QMimeData *mime = new QMimeData;
  51. mime->setData("application/x-component", type.toUtf8());
  52. QDrag *drag = new QDrag(this);
  53. drag->setMimeData(mime);
  54. drag->setPixmap(dragItem->icon().pixmap(ui->listWidget->iconSize()));
  55. drag->setHotSpot(drag->pixmap().rect().center());
  56. drag->exec(Qt::CopyAction);
  57. dragItem = nullptr;
  58. }
  59. } else if (event->type() == QEvent::MouseButtonRelease) {
  60. dragItem = nullptr;
  61. }
  62. }
  63. return QMainWindow::eventFilter(obj, event);
  64. }
  65. /* ---------- 填充列表 ---------- */
  66. void MainWindow::createComponents()
  67. {
  68. struct Comp { QString name; QColor color; };
  69. const QVector<Comp> comps = {
  70. {"常开", Qt::blue},
  71. {"常闭", Qt::red},
  72. {"比较", Qt::green},
  73. {"线圈", Qt::darkYellow}
  74. };
  75. for (const Comp &c : comps) {
  76. QListWidgetItem *it = new QListWidgetItem(c.name, ui->listWidget);
  77. QPixmap pix(60, 30);
  78. pix.fill(Qt::white);
  79. QPainter p(&pix);
  80. p.setRenderHint(QPainter::Antialiasing);
  81. p.setBrush(c.color.lighter(150));
  82. p.setPen(QPen(c.color, 2));
  83. p.drawRoundedRect(QRect(5, 5, 50, 20), 3, 3);
  84. p.setPen(Qt::black);
  85. p.drawText(QRect(5, 5, 50, 20), Qt::AlignCenter, c.name);
  86. it->setIcon(QIcon(pix));
  87. it->setData(Qt::UserRole, c.name);
  88. }
  89. }