#include "BondGraphicsView.h" #include #include #include #include #include BondItem::BondItem(ns_mat::POINT_INFO_STRUCT point, QGraphicsItem* parent) : QGraphicsRectItem(parent), point(point) { setBrush(getColorByStatus(point.stBondStatus.bDieStatus)); setPen(QPen(QColor(0, 0, 0), 1)); } void BondItem::setSelected(bool selected) { if (selected) { setPen(QPen(Qt::red, 1)); } else { setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框 } } void BondItem::setLeftSelected(bool selected) { if (selected) { setPen(QPen(Qt::green, 1)); } else { setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框 } } QColor BondItem::getColorByStatus(ns_mat::DIE_STATUS status) { switch (status) { //case ns_mat::DIE_STATUS::NO_PICK: return QColor(200, 200, 200); //case ns_mat::DIE_STATUS::WAF_PICK_DONE: return QColor(100, 200, 230); //case ns_mat::DIE_STATUS::TRANSFER_BOND_DONE: return QColor(255, 255, 0); case ns_mat::DIE_STATUS::TRANSFER_PICK_DONE: return QColor(255, 165, 0); case ns_mat::DIE_STATUS::LOOKUP_CALIB_DONE: return QColor(0, 150, 255); case ns_mat::DIE_STATUS::BOND_DONE: return QColor(144, 238, 144); case ns_mat::DIE_STATUS::BOND_DEL: return QColor(255, 50, 50); default: return Qt::gray; } } BondGraphicsView::BondGraphicsView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr), scaleFactor(1.0), isDragging(false), thumbnailLabel(nullptr), thumbnailVisible(false) { setRenderHint(QPainter::Antialiasing); // setDragMode(QGraphicsView::ScrollHandDrag); // 支持拖动视图 setTransformationAnchor(QGraphicsView::AnchorUnderMouse); // 缩放时以鼠标为中心 // 初始化缩略图标签 thumbnailLabel = new QLabel(this); thumbnailLabel->setFixedSize(150, 150); thumbnailLabel->move(0, 0); // 默认左上角位置 thumbnailLabel->setStyleSheet("background-color: white; border: 1px solid gray;"); thumbnailLabel->installEventFilter(this); thumbnailLabel->hide(); } // 事件过滤器用于处理缩略图拖动 bool BondGraphicsView::eventFilter(QObject* obj, QEvent* event) { static QPoint dragStartPosition; if (obj == thumbnailLabel) { if (event->type() == QEvent::MouseButtonPress) { QMouseEvent* me = static_cast(event); dragStartPosition = me->pos(); return true; } else if (event->type() == QEvent::MouseMove) { QMouseEvent* me = static_cast(event); // 计算新位置 QPoint newPos = thumbnailLabel->pos() + (me->pos() - dragStartPosition); // 限制在视图范围内 int maxX = this->width() - thumbnailLabel->width(); int maxY = this->height() - thumbnailLabel->height(); // 使用qBound限制坐标范围(0 <= x <= maxX,0 <= y <= maxY) newPos.setX(qBound(0, newPos.x(), maxX)); newPos.setY(qBound(0, newPos.y(), maxY)); thumbnailLabel->move(newPos); return true; } } return QGraphicsView::eventFilter(obj, event); } void BondGraphicsView::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { // 清空选中的 BondItem for (auto& item : selectedItemsMap) { BondItem* die = dynamic_cast(item); if (die) { die->setSelected(false); // 取消选中状态 } } selectedItemsMap.clear(); // 获取点击位置的 BondItem if (selectedItem && selectedItem->scene()) { selectedItem->setLeftSelected(false); } selectedItem.clear(); QGraphicsItem* item = itemAt(event->pos()); // if (BondItem* bondItem = dynamic_cast(item)) { // selectedItem = bondItem; // selectedItem->setLeftSelected(true); // } BondItem* bondItem = nullptr; while (item && !bondItem) { bondItem = dynamic_cast(item); item = item->parentItem(); } if (bondItem) { selectedItem = bondItem; selectedItem->setLeftSelected(true); } setCursor(Qt::OpenHandCursor); // 按下时设置为小手 selecting = true; lastPos = event->pos(); // 记录鼠标位置 } else if (event->button() == Qt::RightButton) { // 开始框选 selecting = true; selectionStart = mapToScene(event->pos()); isDragging = false; if (!selectionRect) { selectionRect = new QGraphicsRectItem(); selectionRect->setPen(QPen(Qt::NoPen)); selectionRect->setBrush(QBrush(QColor(0, 0, 255, 50))); // 半透明蓝色 scene()->addItem(selectionRect); } selectionRect->setRect(QRectF(selectionStart, QSizeF())); } QGraphicsView::mousePressEvent(event); } void BondGraphicsView::mouseMoveEvent(QMouseEvent* event) { if (selecting && selectionRect) { QPointF currentPos = mapToScene(event->pos()); selectionRect->setRect(QRectF(selectionStart, currentPos).normalized()); isDragging = true; } else if (selecting) { // 计算鼠标当前位置与上次位置的差值 QPointF delta = event->pos() - lastPos; // 平移视图 horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x()); verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y()); lastPos = event->pos(); // 更新鼠标位置 } QGraphicsView::mouseMoveEvent(event); } void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { setCursor(Qt::ArrowCursor); // 松开时恢复为箭头 selecting = false; } else if (event->button() == Qt::RightButton && selecting) { selecting = false; if (selectionRect && isDragging) { if (selectedItem && selectedItem->scene()) { selectedItem->setLeftSelected(false); } selectedItem.clear(); QRectF selectedArea = selectionRect->rect(); scene()->removeItem(selectionRect); delete selectionRect; selectionRect = nullptr; QList items = scene()->items(selectedArea, Qt::IntersectsItemShape); for (QGraphicsItem* item : items) { if (BondItem* die = dynamic_cast(item)) { selectedItemsMap.insert(die->point.stIndex.iIndex, die); die->setSelected(true); } } } if (selectionRect) { scene()->removeItem(selectionRect); delete selectionRect; selectionRect = nullptr; } // 如果没有进行拖动,则弹出右键菜单 if (!isDragging) { QGraphicsItem* item = itemAt(event->pos()); QMenu menu; QAction* showThumb = menu.addAction(thumbnailVisible ? tr("Hide thumbnails", "隐藏缩略图") : tr("Show thumbnails", "显示缩略图")); connect(showThumb, &QAction::triggered, [this] { thumbnailVisible ? hideThumbnail() : showThumbnail(); }); menu.addAction(tr("Send Location", "发送位置"), [this] { if (selectedItem) { qDebug() << selectedItem->point.stIndex.iIndex; selectedItem->setLeftSelected(false); selectedItem = nullptr; } }); BondItem* die = nullptr; while (item && !die) { die = dynamic_cast(item); item = item->parentItem(); } if (die) { menu.addAction(tr("move to current location","移动到该位置"), [this, die] { for (auto& item : selectedItemsMap) { BondItem* die = dynamic_cast(item); if (die) { die->setSelected(false); } } selectedItemsMap.clear(); if (selectedItem && selectedItem->scene()) { selectedItem->setLeftSelected(false); } selectedItem.clear(); selectedItem = die; selectedItem->setLeftSelected(true); }); } menu.addAction(tr("clear the selected area","清除选中区域"), [this] { clearRegion(); }); menu.addAction(tr("set area","设置区域"), [this] { setRegion(); }); menu.exec(event->globalPos()); } } QGraphicsView::mouseReleaseEvent(event); } void BondGraphicsView::wheelEvent(QWheelEvent* event) { if (event->orientation() == Qt::Vertical) { event->ignore(); // 忽略竖直滚轮事件(即禁用滚动条滑动) return; } event->accept(); } // 缩略图功能实现 void BondGraphicsView::showThumbnail() { // 本地图片路径(根据实际路径修改) QString imagePath = ":/images/test_image/image_1.png"; // 替换为本地图片路径 // 加载本地图片 QPixmap thumb(imagePath); if (!thumb.isNull()) { // 如果图片加载成功,设置为缩略图 thumbnailLabel->setPixmap(thumb.scaled(150, 150, Qt::KeepAspectRatio)); thumbnailLabel->show(); thumbnailVisible = true; } else { // 如果加载图片失败,显示"图片加载失败" thumbnailLabel->setText("图片加载失败"); thumbnailLabel->setAlignment(Qt::AlignCenter); // 居中显示文本 thumbnailLabel->show(); thumbnailVisible = true; } } void BondGraphicsView::hideThumbnail() { thumbnailLabel->hide(); thumbnailVisible = false; thumbnailLabel->move(0, 0); } void BondGraphicsView::clearRegion() { // 清空选中的 BondItem for (auto& item : selectedItemsMap) { if (BondItem* die = dynamic_cast(item)) { die->setSelected(false); } } selectedItemsMap.clear(); if (selectedItem && selectedItem->scene()) { selectedItem->setLeftSelected(false); } selectedItem.clear(); // 清除缩略图 hideThumbnail(); } void BondGraphicsView::setRegion() { for (auto it = selectedItemsMap.begin(); it != selectedItemsMap.end(); ++it) { int key = it.key(); // 获取当前元素的 key qDebug() << key; } // 清空选中的 BondItem for (auto& item : selectedItemsMap) { if (BondItem* die = dynamic_cast(item)) { die->setSelected(false); } } selectedItemsMap.clear(); if (selectedItem && selectedItem->scene()) { selectedItem->setLeftSelected(false); } selectedItem.clear(); }