Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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