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.

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