BondGraphicsView.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include "BondGraphicsView.h"
  2. #include <QMouseEvent>
  3. #include <QGraphicsRectItem>
  4. #include <QDebug>
  5. #include <QScrollBar>
  6. #include <QMenu>
  7. BondItem::BondItem(ns_mat::POINT_INFO_STRUCT point, QGraphicsItem* parent)
  8. : QGraphicsRectItem(parent), point(point) {
  9. setBrush(getColorByStatus(point.stBondStatus.bDieStatus));
  10. setPen(QPen(QColor(0, 0, 0), 1));
  11. }
  12. void BondItem::setSelected(bool selected) {
  13. if (selected) {
  14. setPen(QPen(Qt::red, 1));
  15. }
  16. else {
  17. setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框
  18. }
  19. }
  20. void BondItem::setLeftSelected(bool selected) {
  21. if (selected) {
  22. setPen(QPen(Qt::green, 1));
  23. }
  24. else {
  25. setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框
  26. }
  27. }
  28. QColor BondItem::getColorByStatus(ns_mat::DIE_STATUS status) {
  29. switch (status) {
  30. //case ns_mat::DIE_STATUS::NO_PICK: return QColor(200, 200, 200);
  31. //case ns_mat::DIE_STATUS::WAF_PICK_DONE: return QColor(100, 200, 230);
  32. //case ns_mat::DIE_STATUS::TRANSFER_BOND_DONE: return QColor(255, 255, 0);
  33. case ns_mat::DIE_STATUS::TRANSFER_PICK_DONE: return QColor(255, 165, 0);
  34. case ns_mat::DIE_STATUS::LOOKUP_CALIB_DONE: return QColor(0, 150, 255);
  35. case ns_mat::DIE_STATUS::BOND_DONE: return QColor(144, 238, 144);
  36. case ns_mat::DIE_STATUS::BOND_DEL: return QColor(255, 50, 50);
  37. default: return Qt::gray;
  38. }
  39. }
  40. BondGraphicsView::BondGraphicsView(QGraphicsScene* scene, QWidget* parent)
  41. : QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr),
  42. scaleFactor(1.0), isDragging(false), thumbnailLabel(nullptr),
  43. thumbnailVisible(false) {
  44. setRenderHint(QPainter::Antialiasing);
  45. // setDragMode(QGraphicsView::ScrollHandDrag); // 支持拖动视图
  46. setTransformationAnchor(QGraphicsView::AnchorUnderMouse); // 缩放时以鼠标为中心
  47. // 初始化缩略图标签
  48. thumbnailLabel = new QLabel(this);
  49. thumbnailLabel->setFixedSize(150, 150);
  50. thumbnailLabel->move(0, 0); // 默认左上角位置
  51. thumbnailLabel->setStyleSheet("background-color: white; border: 1px solid gray;");
  52. thumbnailLabel->installEventFilter(this);
  53. thumbnailLabel->hide();
  54. }
  55. // 事件过滤器用于处理缩略图拖动
  56. bool BondGraphicsView::eventFilter(QObject* obj, QEvent* event) {
  57. static QPoint dragStartPosition;
  58. if (obj == thumbnailLabel) {
  59. if (event->type() == QEvent::MouseButtonPress) {
  60. QMouseEvent* me = static_cast<QMouseEvent*>(event);
  61. dragStartPosition = me->pos();
  62. return true;
  63. }
  64. else if (event->type() == QEvent::MouseMove) {
  65. QMouseEvent* me = static_cast<QMouseEvent*>(event);
  66. // 计算新位置
  67. QPoint newPos = thumbnailLabel->pos() + (me->pos() - dragStartPosition);
  68. // 限制在视图范围内
  69. int maxX = this->width() - thumbnailLabel->width();
  70. int maxY = this->height() - thumbnailLabel->height();
  71. // 使用qBound限制坐标范围(0 <= x <= maxX,0 <= y <= maxY)
  72. newPos.setX(qBound(0, newPos.x(), maxX));
  73. newPos.setY(qBound(0, newPos.y(), maxY));
  74. thumbnailLabel->move(newPos);
  75. return true;
  76. }
  77. }
  78. return QGraphicsView::eventFilter(obj, event);
  79. }
  80. void BondGraphicsView::mousePressEvent(QMouseEvent* event) {
  81. if (event->button() == Qt::LeftButton) {
  82. // 清空选中的 BondItem
  83. for (auto& item : selectedItemsMap) {
  84. BondItem* die = dynamic_cast<BondItem*>(item);
  85. if (die) {
  86. die->setSelected(false); // 取消选中状态
  87. }
  88. }
  89. selectedItemsMap.clear();
  90. // 获取点击位置的 BondItem
  91. if (selectedItem && selectedItem->scene()) {
  92. selectedItem->setLeftSelected(false);
  93. }
  94. selectedItem.clear();
  95. QGraphicsItem* item = itemAt(event->pos());
  96. // if (BondItem* bondItem = dynamic_cast<BondItem*>(item)) {
  97. // selectedItem = bondItem;
  98. // selectedItem->setLeftSelected(true);
  99. // }
  100. BondItem* bondItem = nullptr;
  101. while (item && !bondItem) {
  102. bondItem = dynamic_cast<BondItem*>(item);
  103. item = item->parentItem();
  104. }
  105. if (bondItem) {
  106. selectedItem = bondItem;
  107. selectedItem->setLeftSelected(true);
  108. }
  109. setCursor(Qt::OpenHandCursor); // 按下时设置为小手
  110. selecting = true;
  111. lastPos = event->pos(); // 记录鼠标位置
  112. }
  113. else if (event->button() == Qt::RightButton) {
  114. // 开始框选
  115. selecting = true;
  116. selectionStart = mapToScene(event->pos());
  117. isDragging = false;
  118. if (!selectionRect) {
  119. selectionRect = new QGraphicsRectItem();
  120. selectionRect->setPen(QPen(Qt::NoPen));
  121. selectionRect->setBrush(QBrush(QColor(0, 0, 255, 50))); // 半透明蓝色
  122. scene()->addItem(selectionRect);
  123. }
  124. selectionRect->setRect(QRectF(selectionStart, QSizeF()));
  125. }
  126. QGraphicsView::mousePressEvent(event);
  127. }
  128. void BondGraphicsView::mouseMoveEvent(QMouseEvent* event) {
  129. if (selecting && selectionRect) {
  130. QPointF currentPos = mapToScene(event->pos());
  131. selectionRect->setRect(QRectF(selectionStart, currentPos).normalized());
  132. isDragging = true;
  133. }
  134. else if (selecting) {
  135. // 计算鼠标当前位置与上次位置的差值
  136. QPointF delta = event->pos() - lastPos;
  137. // 平移视图
  138. horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x());
  139. verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y());
  140. lastPos = event->pos(); // 更新鼠标位置
  141. }
  142. QGraphicsView::mouseMoveEvent(event);
  143. }
  144. void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
  145. if (event->button() == Qt::LeftButton) {
  146. setCursor(Qt::ArrowCursor); // 松开时恢复为箭头
  147. selecting = false;
  148. }
  149. else if (event->button() == Qt::RightButton && selecting) {
  150. selecting = false;
  151. if (selectionRect && isDragging) {
  152. if (selectedItem && selectedItem->scene()) {
  153. selectedItem->setLeftSelected(false);
  154. }
  155. selectedItem.clear();
  156. QRectF selectedArea = selectionRect->rect();
  157. scene()->removeItem(selectionRect);
  158. delete selectionRect;
  159. selectionRect = nullptr;
  160. QList<QGraphicsItem*> items = scene()->items(selectedArea, Qt::IntersectsItemShape);
  161. for (QGraphicsItem* item : items) {
  162. if (BondItem* die = dynamic_cast<BondItem*>(item)) {
  163. selectedItemsMap.insert(die->point.stIndex.iIndex, die);
  164. die->setSelected(true);
  165. }
  166. }
  167. }
  168. if (selectionRect) {
  169. scene()->removeItem(selectionRect);
  170. delete selectionRect;
  171. selectionRect = nullptr;
  172. }
  173. // 如果没有进行拖动,则弹出右键菜单
  174. if (!isDragging) {
  175. QGraphicsItem* item = itemAt(event->pos());
  176. QMenu menu;
  177. QAction* showThumb = menu.addAction(thumbnailVisible ? "隐藏缩略图" : "显示缩略图");
  178. connect(showThumb, &QAction::triggered, [this] {
  179. thumbnailVisible ? hideThumbnail() : showThumbnail();
  180. });
  181. menu.addAction("发送位置", [this] {
  182. if (selectedItem) {
  183. qDebug() << selectedItem->point.stIndex.iIndex;
  184. selectedItem->setLeftSelected(false);
  185. selectedItem = nullptr;
  186. }
  187. });
  188. BondItem* die = nullptr;
  189. while (item && !die) {
  190. die = dynamic_cast<BondItem*>(item);
  191. item = item->parentItem();
  192. }
  193. if (die) {
  194. menu.addAction("移动到该位置", [this, die] {
  195. for (auto& item : selectedItemsMap) {
  196. BondItem* die = dynamic_cast<BondItem*>(item);
  197. if (die) {
  198. die->setSelected(false);
  199. }
  200. }
  201. selectedItemsMap.clear();
  202. if (selectedItem && selectedItem->scene()) {
  203. selectedItem->setLeftSelected(false);
  204. }
  205. selectedItem.clear();
  206. selectedItem = die;
  207. selectedItem->setLeftSelected(true);
  208. });
  209. }
  210. menu.addAction("清除选中区域", [this] { clearRegion(); });
  211. menu.addAction("设置区域", [this] { setRegion(); });
  212. menu.exec(event->globalPos());
  213. }
  214. }
  215. QGraphicsView::mouseReleaseEvent(event);
  216. }
  217. void BondGraphicsView::wheelEvent(QWheelEvent* event) {
  218. if (event->orientation() == Qt::Vertical) {
  219. event->ignore(); // 忽略竖直滚轮事件(即禁用滚动条滑动)
  220. return;
  221. }
  222. event->accept();
  223. }
  224. // 缩略图功能实现
  225. void BondGraphicsView::showThumbnail() {
  226. // 本地图片路径(根据实际路径修改)
  227. QString imagePath = ":/images/test_image/image_1.png"; // 替换为本地图片路径
  228. // 加载本地图片
  229. QPixmap thumb(imagePath);
  230. if (!thumb.isNull()) {
  231. // 如果图片加载成功,设置为缩略图
  232. thumbnailLabel->setPixmap(thumb.scaled(150, 150, Qt::KeepAspectRatio));
  233. thumbnailLabel->show();
  234. thumbnailVisible = true;
  235. }
  236. else {
  237. // 如果加载图片失败,显示"图片加载失败"
  238. thumbnailLabel->setText("图片加载失败");
  239. thumbnailLabel->setAlignment(Qt::AlignCenter); // 居中显示文本
  240. thumbnailLabel->show();
  241. thumbnailVisible = true;
  242. }
  243. }
  244. void BondGraphicsView::hideThumbnail() {
  245. thumbnailLabel->hide();
  246. thumbnailVisible = false;
  247. thumbnailLabel->move(0, 0);
  248. }
  249. void BondGraphicsView::clearRegion()
  250. {
  251. // 清空选中的 BondItem
  252. for (auto& item : selectedItemsMap) {
  253. if (BondItem* die = dynamic_cast<BondItem*>(item)) {
  254. die->setSelected(false);
  255. }
  256. }
  257. selectedItemsMap.clear();
  258. if (selectedItem && selectedItem->scene()) {
  259. selectedItem->setLeftSelected(false);
  260. }
  261. selectedItem.clear();
  262. // 清除缩略图
  263. hideThumbnail();
  264. }
  265. void BondGraphicsView::setRegion()
  266. {
  267. for (auto it = selectedItemsMap.begin(); it != selectedItemsMap.end(); ++it) {
  268. int key = it.key(); // 获取当前元素的 key
  269. qDebug() << key;
  270. }
  271. // 清空选中的 BondItem
  272. for (auto& item : selectedItemsMap) {
  273. if (BondItem* die = dynamic_cast<BondItem*>(item)) {
  274. die->setSelected(false);
  275. }
  276. }
  277. selectedItemsMap.clear();
  278. if (selectedItem && selectedItem->scene()) {
  279. selectedItem->setLeftSelected(false);
  280. }
  281. selectedItem.clear();
  282. }