|
@@ -1,6 +1,9 @@
|
|
|
#include "BondGraphicsView.h"
|
|
|
+#include <QMouseEvent>
|
|
|
+#include <QGraphicsRectItem>
|
|
|
#include <QDebug>
|
|
|
#include <QScrollBar>
|
|
|
+#include <QMenu>
|
|
|
|
|
|
BondItem::BondItem(ns_mat::POINT_INFO_STRUCT point, QGraphicsItem* parent)
|
|
|
: QGraphicsRectItem(parent), point(point) {
|
|
@@ -53,21 +56,20 @@ BondGraphicsView::BondGraphicsView(QGraphicsScene* scene, QWidget* parent)
|
|
|
thumbnailLabel->setStyleSheet("background-color: white; border: 1px solid gray;");
|
|
|
thumbnailLabel->installEventFilter(this);
|
|
|
thumbnailLabel->hide();
|
|
|
-
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// 事件过滤器用于处理缩略图拖动
|
|
|
-bool BondGraphicsView::eventFilter(QObject *obj, QEvent *event) {
|
|
|
+bool BondGraphicsView::eventFilter(QObject* obj, QEvent* event) {
|
|
|
static QPoint dragStartPosition;
|
|
|
if (obj == thumbnailLabel) {
|
|
|
if (event->type() == QEvent::MouseButtonPress) {
|
|
|
- QMouseEvent *me = static_cast<QMouseEvent*>(event);
|
|
|
+ QMouseEvent* me = static_cast<QMouseEvent*>(event);
|
|
|
dragStartPosition = me->pos();
|
|
|
return true;
|
|
|
- } else if (event->type() == QEvent::MouseMove) {
|
|
|
- QMouseEvent *me = static_cast<QMouseEvent*>(event);
|
|
|
+ }
|
|
|
+ else if (event->type() == QEvent::MouseMove) {
|
|
|
+ QMouseEvent* me = static_cast<QMouseEvent*>(event);
|
|
|
|
|
|
// 计算新位置
|
|
|
QPoint newPos = thumbnailLabel->pos() + (me->pos() - dragStartPosition);
|
|
@@ -89,42 +91,40 @@ bool BondGraphicsView::eventFilter(QObject *obj, QEvent *event) {
|
|
|
|
|
|
void BondGraphicsView::mousePressEvent(QMouseEvent* event) {
|
|
|
if (event->button() == Qt::LeftButton) {
|
|
|
- // 清空选中的 DieItem
|
|
|
+ // 清空选中的 BondItem
|
|
|
for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ BondItem* die = dynamic_cast<BondItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false); // 取消选中状态
|
|
|
}
|
|
|
}
|
|
|
selectedItemsMap.clear();
|
|
|
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
-
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
- // 获取点击位置的 DieItem
|
|
|
+ // 获取点击位置的 BondItem
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
|
selectedItem.clear();
|
|
|
QGraphicsItem* item = itemAt(event->pos());
|
|
|
- if (item) {
|
|
|
- selectedItem = dynamic_cast<DieItem*>(item);
|
|
|
+ // if (BondItem* bondItem = dynamic_cast<BondItem*>(item)) {
|
|
|
+ // selectedItem = bondItem;
|
|
|
+ // selectedItem->setLeftSelected(true);
|
|
|
+ // }
|
|
|
+ BondItem* bondItem = nullptr;
|
|
|
+ while (item && !bondItem) {
|
|
|
+ bondItem = dynamic_cast<BondItem*>(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) {
|
|
|
+ }
|
|
|
+ else if (event->button() == Qt::RightButton) {
|
|
|
// 开始框选
|
|
|
selecting = true;
|
|
|
selectionStart = mapToScene(event->pos());
|
|
@@ -145,7 +145,8 @@ void BondGraphicsView::mouseMoveEvent(QMouseEvent* event) {
|
|
|
QPointF currentPos = mapToScene(event->pos());
|
|
|
selectionRect->setRect(QRectF(selectionStart, currentPos).normalized());
|
|
|
isDragging = true;
|
|
|
- } else if (selecting) {
|
|
|
+ }
|
|
|
+ else if (selecting) {
|
|
|
// 计算鼠标当前位置与上次位置的差值
|
|
|
QPointF delta = event->pos() - lastPos;
|
|
|
// 平移视图
|
|
@@ -160,7 +161,8 @@ void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
if (event->button() == Qt::LeftButton) {
|
|
|
setCursor(Qt::ArrowCursor); // 松开时恢复为箭头
|
|
|
selecting = false;
|
|
|
- } else if (event->button() == Qt::RightButton && selecting) {
|
|
|
+ }
|
|
|
+ else if (event->button() == Qt::RightButton && selecting) {
|
|
|
selecting = false;
|
|
|
if (selectionRect && isDragging) {
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
@@ -168,17 +170,6 @@ void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
}
|
|
|
selectedItem.clear();
|
|
|
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
-
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
QRectF selectedArea = selectionRect->rect();
|
|
|
scene()->removeItem(selectionRect);
|
|
|
delete selectionRect;
|
|
@@ -186,11 +177,9 @@ void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
|
|
|
QList<QGraphicsItem*> items = scene()->items(selectedArea, Qt::IntersectsItemShape);
|
|
|
for (QGraphicsItem* item : items) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
- if (die) {
|
|
|
- // 将 DieItem 添加到 map 中
|
|
|
- selectedItemsMap.insert(qMakePair(die->getRow(), die->getCol()), die);
|
|
|
- die->setSelected(true); // 设置选中状态
|
|
|
+ if (BondItem* die = dynamic_cast<BondItem*>(item)) {
|
|
|
+ selectedItemsMap.insert(die->point.stIndex.iIndex, die);
|
|
|
+ die->setSelected(true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -202,43 +191,34 @@ void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
// 如果没有进行拖动,则弹出右键菜单
|
|
|
if (!isDragging) {
|
|
|
QGraphicsItem* item = itemAt(event->pos());
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
QMenu menu;
|
|
|
QAction* showThumb = menu.addAction(thumbnailVisible ? "隐藏缩略图" : "显示缩略图");
|
|
|
|
|
|
-
|
|
|
- connect(showThumb, &QAction::triggered, [this]{
|
|
|
+ connect(showThumb, &QAction::triggered, [this] {
|
|
|
thumbnailVisible ? hideThumbnail() : showThumbnail();
|
|
|
- });
|
|
|
+ });
|
|
|
menu.addAction("发送位置", [this] {
|
|
|
if (selectedItem) {
|
|
|
- qDebug() << "Row:" << selectedItem->getRow() << "Col:" << selectedItem->getCol();
|
|
|
+ qDebug() << selectedItem->point.stIndex.iIndex;
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
selectedItem = nullptr;
|
|
|
}
|
|
|
- });
|
|
|
+ });
|
|
|
+ BondItem* die = nullptr;
|
|
|
+ while (item && !die) {
|
|
|
+ die = dynamic_cast<BondItem*>(item);
|
|
|
+ item = item->parentItem();
|
|
|
+ }
|
|
|
if (die) {
|
|
|
menu.addAction("移动到该位置", [this, die] {
|
|
|
for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ BondItem* die = dynamic_cast<BondItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false);
|
|
|
}
|
|
|
}
|
|
|
selectedItemsMap.clear();
|
|
|
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
-
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
-
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
@@ -246,30 +226,7 @@ void BondGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
|
|
|
selectedItem = die;
|
|
|
selectedItem->setLeftSelected(true);
|
|
|
- });
|
|
|
-
|
|
|
- // 设置区域边界点菜单
|
|
|
- menu.addAction("设为左上点", [this, die] {
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
- topLeftItem = die;
|
|
|
- topLeftItem->setRightSelected(true);
|
|
|
- topLeftIndex = qMakePair(die->getRow(), die->getCol());
|
|
|
- if (bottomRightIndex.first >= 0) checkAndCreateRegion();
|
|
|
- });
|
|
|
-
|
|
|
- menu.addAction("设为右下点", [this, die] {
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- bottomRightItem = die;
|
|
|
- bottomRightItem->setRightSelected(true);
|
|
|
- bottomRightIndex = qMakePair(die->getRow(), die->getCol());
|
|
|
- if (topLeftIndex.first >= 0) checkAndCreateRegion();
|
|
|
- });
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
menu.addAction("清除选中区域", [this] { clearRegion(); });
|
|
@@ -302,7 +259,8 @@ void BondGraphicsView::showThumbnail() {
|
|
|
thumbnailLabel->setPixmap(thumb.scaled(150, 150, Qt::KeepAspectRatio));
|
|
|
thumbnailLabel->show();
|
|
|
thumbnailVisible = true;
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
// 如果加载图片失败,显示"图片加载失败"
|
|
|
thumbnailLabel->setText("图片加载失败");
|
|
|
thumbnailLabel->setAlignment(Qt::AlignCenter); // 居中显示文本
|
|
@@ -316,47 +274,13 @@ void BondGraphicsView::hideThumbnail() {
|
|
|
thumbnailVisible = false;
|
|
|
thumbnailLabel->move(0, 0);
|
|
|
}
|
|
|
-void BondGraphicsView::checkAndCreateRegion()
|
|
|
-{
|
|
|
- // 仅当两个点都有效时处理
|
|
|
- if (topLeftIndex.first < 0 || bottomRightIndex.first < 0) return;
|
|
|
-
|
|
|
- // 确定行列范围
|
|
|
- int startRow = qMin(topLeftIndex.first, bottomRightIndex.first);
|
|
|
- int endRow = qMax(topLeftIndex.first, bottomRightIndex.first);
|
|
|
- int startCol = qMin(topLeftIndex.second, bottomRightIndex.second);
|
|
|
- int endCol = qMax(topLeftIndex.second, bottomRightIndex.second);
|
|
|
-
|
|
|
- // 遍历场景中的所有项
|
|
|
- foreach (QGraphicsItem* item, scene()->items()) {
|
|
|
- if (DieItem* die = dynamic_cast<DieItem*>(item)) {
|
|
|
- int row = die->getRow();
|
|
|
- int col = die->getCol();
|
|
|
-
|
|
|
- // 判断是否在区域内
|
|
|
- if (row >= startRow && row <= endRow &&
|
|
|
- col >= startCol && col <= endCol) {
|
|
|
-
|
|
|
- // 更新选中状态
|
|
|
- die->setSelected(true);
|
|
|
- selectedItemsMap.insert(qMakePair(row, col), die);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 重置索引点
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
-
|
|
|
-}
|
|
|
|
|
|
void BondGraphicsView::clearRegion()
|
|
|
{
|
|
|
- // 清空选中的 DieItem
|
|
|
+ // 清空选中的 BondItem
|
|
|
for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
- if (die) {
|
|
|
- die->setSelected(false); // 取消选中状态
|
|
|
+ if (BondItem* die = dynamic_cast<BondItem*>(item)) {
|
|
|
+ die->setSelected(false);
|
|
|
}
|
|
|
}
|
|
|
selectedItemsMap.clear();
|
|
@@ -366,18 +290,6 @@ void BondGraphicsView::clearRegion()
|
|
|
}
|
|
|
selectedItem.clear();
|
|
|
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
-
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
-
|
|
|
// 清除缩略图
|
|
|
hideThumbnail();
|
|
|
|
|
@@ -385,15 +297,14 @@ void BondGraphicsView::clearRegion()
|
|
|
void BondGraphicsView::setRegion()
|
|
|
{
|
|
|
for (auto it = selectedItemsMap.begin(); it != selectedItemsMap.end(); ++it) {
|
|
|
- QPair<int, int> key = it.key(); // 获取当前元素的 key
|
|
|
- qDebug() << "Row:" << key.first << ", Col:" << key.second;
|
|
|
+ int key = it.key(); // 获取当前元素的 key
|
|
|
+ qDebug() << key;
|
|
|
}
|
|
|
|
|
|
- // 清空选中的 DieItem
|
|
|
+ // 清空选中的 BondItem
|
|
|
for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
- if (die) {
|
|
|
- die->setSelected(false); // 取消选中状态
|
|
|
+ if (BondItem* die = dynamic_cast<BondItem*>(item)) {
|
|
|
+ die->setSelected(false);
|
|
|
}
|
|
|
}
|
|
|
selectedItemsMap.clear();
|
|
@@ -402,16 +313,4 @@ void BondGraphicsView::setRegion()
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
|
selectedItem.clear();
|
|
|
-
|
|
|
- if (topLeftItem && topLeftItem->scene()) {
|
|
|
- topLeftItem->setRightSelected(false);
|
|
|
- }
|
|
|
- topLeftItem.clear();
|
|
|
-
|
|
|
- if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
- bottomRightItem->setRightSelected(false);
|
|
|
- }
|
|
|
- bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
}
|