25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

107 satır
3.1 KiB

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