#include "RoiScene.h" #include #include #include "RoiItem.h" #include "QGraphicsSceneEvent" #include "colossusbase.h" #pragma execution_character_set("utf-8") RoiScene::RoiScene(QObject *parent) :QGraphicsScene(parent) { m_bDisableMenu = true; m_pImageItem = NULL; mpShowImage = NULL; m_tCurrentPos = QPoint(0, 0); flag = 0; } RoiScene::~RoiScene() { m_graphItemMapStruct.clear(); if (m_pImageItem) { delete m_pImageItem; m_pImageItem = nullptr; } if (mpShowImage) { delete mpShowImage; mpShowImage = NULL; } if(pLineItem) delete pLineItem; if(pTenLineITemH) delete pTenLineITemH; if (pTenLineITemV) delete pTenLineITemV; } void RoiScene::mouseEvent(QGraphicsSceneMouseEvent *mouseEvent) { switch (mouseEvent->type()){ case QEvent::GraphicsSceneMousePress: QGraphicsScene::mousePressEvent(mouseEvent); break; case QEvent::GraphicsSceneMouseMove: QGraphicsScene::mouseMoveEvent(mouseEvent); break; case QEvent::GraphicsSceneMouseRelease: QGraphicsScene::mouseReleaseEvent(mouseEvent); break; } } bool RoiScene::Initialize(LP_DETECTOR_ROI_DATA roiData) { if (pLineItem) { removeItem(pLineItem); pLineItem = NULL; } if (pTenLineITemH){ removeItem(pTenLineITemH); pTenLineITemH = NULL; } if (pTenLineITemV){ removeItem(pTenLineITemV); pTenLineITemV = NULL; } this->clear(); if (mpShowImage) { delete mpShowImage; mpShowImage = NULL; } InitShowImage(roiData.img); updateInfoLable(); m_graphItemMapStruct.clear(); int nRecordCount = roiData.records.size(); if (nRecordCount > 0) { for (int i = 0; i < nRecordCount; i++) { Item_List record = roiData.records.at(i); if (!roiData.img.empty()) { int maxwidth = roiData.img.cols; int maxheigh = roiData.img.rows; CheckRecord(record,maxwidth,maxheigh); } if (!InitRecord(record, i)) return false; } } if (m_graphItemMapStruct.size() == 2) { GraphicsItem *pFirst =m_graphItemMapStruct.firstKey(); GraphicsItem *pSecond = m_graphItemMapStruct.lastKey(); int firstVal = pFirst->boundingRect().width()*pFirst->boundingRect().height(); int secondVal = pSecond->boundingRect().width()*pSecond->boundingRect().height(); if (firstVal > secondVal) { centerPoint = pFirst->scenePos(); startPoint = pSecond->scenePos(); m_graphItemMapStruct[pFirst]._model = ENUM_LOCKROI; m_graphItemMapStruct[pSecond]._model = ENUM_UNBINDROI; } else { centerPoint = pSecond->scenePos(); startPoint = pFirst->scenePos(); m_graphItemMapStruct[pSecond]._model = ENUM_LOCKROI; m_graphItemMapStruct[pFirst]._model = ENUM_UNBINDROI; } } else { flag = 0; centerPoint = startPoint = QPointF(); } if (bUseTenFlag == true) { updateTenItem(true); } return true; } bool RoiScene::CheckRecord(Item_List &record, int maxwidth,int maxheight) { Item_List newRecord; int nCount = record.size(); if (nCount > 1) nCount = 1; if (nCount > 0) { for (int i = 0; i < nCount; i++) { Feature_List item = record.at(i); if (item.first == RECTANGLE) { if (item.second.at(2)>maxwidth) { item.second.replace(2, maxwidth / 2); } if (item.second.at(3) > maxheight) { item.second.replace(3, maxheight / 2); } } else if (item.first == ELLIPSE) { if (item.second.at(2) > maxwidth) { item.second.replace(2, maxwidth / 2); } if (item.second.at(3) > maxheight) { item.second.replace(3, maxheight / 2); } } else if (item.first == CIRCLE) { if (maxheight > maxwidth) { if (item.second.at(2) > maxwidth) { item.second.replace(2, maxwidth / 2); } } else { if (item.second.at(2) > maxheight) { item.second.replace(2, maxheight / 2); } } } newRecord.push_back(item); } record = newRecord; } return true; } bool RoiScene::InitRecord(Item_List record, int nIndex) { int nCount = record.size(); if (nCount > 1) nCount = 1; if (nCount > 0) { QList graphicItems; for (int i = 0; i < nCount; i++) { Feature_List item = record.at(i); GraphicsItem* graphicItem = NULL; if (item.first == RECTANGLE) { QRect mRect; graphicItem = new GraphicsRectItem(QRect(0, 0, abs(item.second.at(2)), abs(item.second.at(3))), NULL); graphicItem->SetType(GraphicsRect); } else if (item.first == ELLIPSE) { graphicItem = new GraphicsEllipseItem(QRect(0, 0, abs(item.second.at(2)) * 2, abs(item.second.at(3)) * 2), NULL); graphicItem->SetType(GraphicsEllipse); } else if (item.first == CIRCLE) { graphicItem = new GraphicsEllipseItem(QRect(0, 0, abs(item.second.at(2)) * 2, abs(item.second.at(2)) * 2), NULL); graphicItem->SetType(GraphicsCircle); } if (graphicItem) { graphicItem->SetLock(true); graphicItem->SetColor(SystemStateInfo::rgb); graphicItem->SetCheckState(true); graphicItem->setPen(Qt::NoPen); graphicItem->setZValue(1); graphicItems.push_back(graphicItem); addItem(graphicItem); QPointF itemPoint; itemPoint.setX(item.second.at(0)); itemPoint.setY(item.second.at(1)); graphicItem->setPos(itemPoint-mImgPosOffSet); //m_graphItemMap[graphicItem]= maptoImgNewPos(graphicItem); tagROIParas tagItem; tagItem._model = ENUM_LOCKROI; tagItem.rectf = maptoImgNewPos(graphicItem); m_graphItemMapStruct[graphicItem] = tagItem; } } } return true; } void RoiScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { if (DrawTool::c_drawShape == selection) { QList items = this->selectedItems(); GraphicsItem *item = 0; QPointF mousePoint = maptoImgPos(mouseEvent->scenePos()); QString strPoint = QString("%1,%2").arg(mousePoint.x()).arg(mousePoint.y()); if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item != 0 && item->GetLock()) { //return QGraphicsScene::mousePressEvent(mouseEvent); } if (item == NULL) return QGraphicsScene::mousePressEvent(mouseEvent); DrawTool * tool = DrawTool::findTool(DrawTool::c_drawShape); if (tool) tool->mousePressEvent(mouseEvent, this); if (item != 0 && !item->GetCheckState()) { //m_pRoiDlg->ResetItem(maptoImgPos(item->scenePos()), item->boundingRect().toRect()); emit sgResetItem(maptoImgPos(item->scenePos()), item->boundingRect().toRect()); m_graphItemMapStruct[item].rectf = maptoImgNewPos(item); } } else { flag = 0; DrawTool * tool = DrawTool::findTool(DrawTool::c_drawShape); if (tool) tool->mousePressEvent(mouseEvent, this); } } void RoiScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { if (DrawTool::c_drawShape == selection) { QList items = this->selectedItems(); GraphicsItem *item = 0; if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item == 0) return; if(item->GetLock()) return; DrawTool * tool = DrawTool::findTool(DrawTool::c_drawShape); m_tCurrentPos = maptoImgPos(mouseEvent->scenePos()); updateInfoLable(); if (tool) tool->mouseMoveEvent(mouseEvent, this); QGraphicsScene::mouseMoveEvent(mouseEvent); } else { DrawTool * tool = DrawTool::findTool(DrawTool::c_drawShape); m_tCurrentPos = maptoImgPos(mouseEvent->scenePos()); updateInfoLable(); if (tool) tool->mouseMoveEvent(mouseEvent, this); QGraphicsScene::mouseMoveEvent(mouseEvent); } } void RoiScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { DrawTool * tool = DrawTool::findTool(DrawTool::c_drawShape); if (tool) tool->mouseReleaseEvent(mouseEvent, this); QList items = this->selectedItems(); GraphicsItem *item = 0; if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item != 0) { //m_pRoiDlg->ResetItem(maptoImgPos(mouseEvent->scenePos()), item->boundingRect().toRect()); emit sgResetItem(maptoImgPos(mouseEvent->scenePos()), item->boundingRect().toRect()); m_graphItemMapStruct[item].rectf = maptoImgNewPos(item); DrawTool::c_drawShape = selection; QGraphicsScene::mouseReleaseEvent(mouseEvent); } } void RoiScene::MoveSelectedItem(DirType type) { QList items = this->selectedItems(); GraphicsItem *item = 0; if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item != 0 && !item->GetCheckState()) { switch (type) { case LEFT: { item->moveBy(-1, 0); break; } case RIGHT: { item->moveBy(1, 0); break; } case UP: { item->moveBy(0, -1); break; } case DOWN: { item->moveBy(0, 1); break; } } emit sgResetItem(maptoImgPos(item->scenePos()),item->boundingRect().toRect()); //m_pRoiDlg->ResetItem(maptoImgPos(item->scenePos()),item->boundingRect().toRect()); m_graphItemMapStruct[item].rectf = maptoImgNewPos(item); } } void RoiScene::SetSelectedItem(QPoint pos, QRect size) { QList items = this->selectedItems(); GraphicsRectItem *item = 0; if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item != 0 && !item->GetCheckState()) { item->resetItem(pos, size); } } void RoiScene::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Left: { MoveSelectedItem(LEFT); break; } case Qt::Key_Right: { MoveSelectedItem(RIGHT); break; } case Qt::Key_Up: { MoveSelectedItem(UP); break; } case Qt::Key_Down: { MoveSelectedItem(DOWN); break; } } return QGraphicsScene::keyPressEvent(event);; } void RoiScene::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { QPointF p =event->pos(); QString s = QString("%1,%2").arg(p.x(), p.y()); } void RoiScene::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { QPointF p = event->pos(); QString s = QString("%1,%2").arg(p.x(), p.y()); } void RoiScene::hoverLeaveEvent(QGraphicsSceneHoverEvent * event) { QPointF p = event->pos(); QString s = QString("%1,%2").arg(p.x(), p.y()); } void RoiScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { if (m_bDisableMenu) return; QList items = this->selectedItems(); QPointF pPointF = maptoImgPos(event->scenePos()); bool bInItem = false; GraphicsItem *ptmpItem = nullptr; for (QMap::iterator its = m_graphItemMapStruct.begin(); its != m_graphItemMapStruct.end(); ++its){ bInItem = its->rectf.contains(pPointF); if (bInItem == true) { ptmpItem = its.key(); break; } } if (bInItem == false) return; if (!ptmpItem) return; QMenu menu((QWidget*)(this->parent())); QAction *deleteAction = NULL; QAction *checkAction = NULL; QAction *unCheckAction = NULL; QAction *radiusFixAction = NULL; QAction *radiusUnfixAction = NULL; enumMemuModel tmpModel = m_graphItemMapStruct[ptmpItem]._model; int itemCount = m_graphItemMapStruct.size(); if (itemCount == 1) if (tmpModel == ENUM_UNBINDROI) { tmpModel = ENUM_LOCKROI; m_graphItemMapStruct[ptmpItem]._model = tmpModel; flag = 0; } if (tmpModel == ENUM_LOCKROI )//绑定 { unCheckAction = menu.addAction(QObject::tr("解绑")); unCheckAction->setObjectName("unCheckAction"); } else if (tmpModel == ENUM_BINDROI) { if (!ptmpItem->GetLock()) { checkAction = menu.addAction(QObject::tr("绑定")); checkAction->setObjectName("checkAction"); } unCheckAction = menu.addAction(QObject::tr("解除径向绑定")); unCheckAction->setObjectName("unCheckAction"); } else if (tmpModel == ENUM_UNBINDROI) { radiusFixAction = menu.addAction(QObject::tr("径向解锁")); radiusFixAction->setObjectName("radiusUnfixAction"); } else { if (items.size() > 0){ deleteAction = menu.addAction(QObject::tr("删除")); deleteAction->setObjectName("deleteAction"); } checkAction = menu.addAction(QObject::tr("绑定")); checkAction->setObjectName("checkAction"); if (m_graphItemMapStruct.size() == 2){ if (tmpModel != ENUM_UNLOCKROI){ unCheckAction = menu.addAction(QObject::tr("解绑")); unCheckAction->setObjectName("unCheckAction"); } GraphicsItem *pFirst = m_graphItemMapStruct.firstKey(); GraphicsItem *pSecond = m_graphItemMapStruct.lastKey(); int firstVal = pFirst->boundingRect().width()*pFirst->boundingRect().height(); int secondVal = pSecond->boundingRect().width()*pSecond->boundingRect().height(); GraphicsItem *pSmallItem = NULL; if (firstVal > secondVal) { pSmallItem = pSecond; } else pSmallItem = pFirst; if (pSmallItem == ptmpItem){ radiusFixAction = menu.addAction(QObject::tr("径向绑定")); radiusFixAction->setObjectName("radiusFixAction"); } } } QAction *selectedAction = menu.exec(event->screenPos()); if (selectedAction == NULL) { menu.clear(); return; } QString strObj = selectedAction->objectName(); if (strObj == "deleteAction")//删除 { flag = 0; QList items = this->selectedItems(); GraphicsItem *item = 0; if (items.count() == 1) item = qgraphicsitem_cast(items.first()); if (item != 0 && !item->GetLock()){ if (m_graphItemMapStruct.contains(item)) m_graphItemMapStruct.remove(item); removeItem(item); delete item; } if (m_graphItemMapStruct.size() <= 1) { if (m_graphItemMapStruct.size() > 0){ if (m_graphItemMapStruct.first()._model == ENUM_UNBINDROI) m_graphItemMapStruct.first()._model = ENUM_LOCKROI; } flag = 0; } updateLineItem(); } else if (strObj == "checkAction")//绑定 { flag = 0; { GraphicsItem *item = ptmpItem;// if (item && !item->GetLock()) { item->SetCheckState(true); item->setState(SelectionHandleOff); item->setFlag(QGraphicsItem::ItemIsMovable, false); item->setFlag(QGraphicsItem::ItemIsSelectable, false); item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false); item->SetLock(true); m_graphItemMapStruct[ptmpItem]._model = ENUM_LOCKROI; } } updateLineItem(); } else if (strObj == "radiusFixAction")//径向绑定 { QPointF valveP = ptmpItem->scenePos(); if (m_graphItemMapStruct.size()==2) { for (QMap::iterator its = m_graphItemMapStruct.begin(); its != m_graphItemMapStruct.end(); ++its) { GraphicsItem *item = its.key(); if (item) { if ((item->scenePos()) != valveP) { item->SetLock(true); item->setState(SelectionHandleOff); item->SetCheckState(true); item->setFlag(QGraphicsItem::ItemIsMovable, false); item->setFlag(QGraphicsItem::ItemIsSelectable, false); item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false); centerPoint =(item->scenePos()); m_graphItemMapStruct[item]._model = ENUM_LOCKROI; } else { item->SetCheckState(false); item->SetLock(false); item->setFlag(QGraphicsItem::ItemIsMovable, true); item->setFlag(QGraphicsItem::ItemIsSelectable, true); item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); startPoint = valveP; flag = 1; m_graphItemMapStruct[item]._model = ENUM_BINDROI; } updateLineItem(); } } } } else if (strObj == "radiusUnfixAction")//径向解绑 { flag = 1; GraphicsItem *item = 0; item = ptmpItem;// if (item->GetCheckState()||item->GetLock()) { startPoint = item->scenePos(); { if (m_graphItemMapStruct.contains(item)) { //item->setState(SelectionHandleOff); item->setState(SelectionHandleActive); item->setFlag(QGraphicsItem::ItemIsMovable, true); item->setFlag(QGraphicsItem::ItemIsSelectable, true); item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); item->SetCheckState(false); item->SetLock(false); m_graphItemMapStruct[item]._model = ENUM_BINDROI; updateLineItem(); } } } } else if (strObj == "unCheckAction")//解绑 { flag = 0; GraphicsItem *item = 0; item = ptmpItem; //if (item->GetLock()||item->GetCheckState()) { if (ENUM_BINDROI == m_graphItemMapStruct[item]._model || ENUM_UNBINDROI == m_graphItemMapStruct[item]._model) { for (QMap::iterator its = m_graphItemMapStruct.begin(); its != m_graphItemMapStruct.end(); ++its) { GraphicsItem *pItem = (its.key()); //pItem->setState(SelectionHandleOff); pItem->setState(SelectionHandleActive); pItem->setFlag(QGraphicsItem::ItemIsMovable, true); pItem->setFlag(QGraphicsItem::ItemIsSelectable, true); pItem->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); pItem->SetCheckState(false); pItem->SetLock(false); its->_model = ENUM_UNLOCKROI; } } else { if (m_graphItemMapStruct.contains(item)) { //item->setState(SelectionHandleOff); bool bulockflag = false; if (m_graphItemMapStruct.size() == 2){ if (m_graphItemMapStruct[item]._model == ENUM_LOCKROI) { for (QMap::iterator its = m_graphItemMapStruct.begin(); its != m_graphItemMapStruct.end(); ++its) { if ((*its)._model == ENUM_UNBINDROI) { bulockflag = true; break; } } } } item->setState(SelectionHandleActive); item->setFlag(QGraphicsItem::ItemIsMovable, true); item->setFlag(QGraphicsItem::ItemIsSelectable, true); item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); item->SetCheckState(false); item->SetLock(false); m_graphItemMapStruct[item]._model = ENUM_UNLOCKROI; if (bulockflag == true) { for (QMap::iterator its = m_graphItemMapStruct.begin(); its != m_graphItemMapStruct.end(); ++its) { GraphicsItem *pItem = (its.key()); //pItem->setState(SelectionHandleOff); pItem->setState(SelectionHandleActive); pItem->setFlag(QGraphicsItem::ItemIsMovable, true); pItem->setFlag(QGraphicsItem::ItemIsSelectable, true); pItem->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); pItem->SetCheckState(false); pItem->SetLock(false); its->_model = ENUM_UNLOCKROI; } } } } } updateLineItem(); } QGraphicsScene::contextMenuEvent(event); menu.clear(); update(); } void RoiScene::scaleImg(qreal scale) { QTransform t; t.scale(scale, scale); mpGraphicsView->setTransform(t); } void RoiScene::updateInfoLable() { if (!mpShowImage) { return; } QRgb pixel = mpShowImage->pixel(m_tCurrentPos); QColor rgb(pixel); QColor hsv = rgb.toHsv(); QString infoStr("Position:[%1, %2] Color(RGB):[%3, %4, %5] (HSV):[%6, %7, %8]"); infoStr = infoStr.arg(m_tCurrentPos.x()).arg(m_tCurrentPos.y()) .arg(rgb.red()).arg(rgb.green()).arg(rgb.blue()) .arg(hsv.hue()).arg(hsv.saturation()).arg(hsv.value()); mpInfoLabel->setText(infoStr); } QRectF RoiScene::maptoImgNewPos(GraphicsItem *pItem) { if (pItem){//相对图像坐标转换 QPointF m_startPoint = maptoImgPos(QPointF(pItem->scenePos().x() - pItem->boundingRect().width()/2.0, \ pItem->scenePos().y() - pItem->boundingRect().height()/2.0)); QPointF endPoint = maptoImgPos(QPointF(pItem->scenePos().x() + pItem->boundingRect().width()/2.0, \ pItem->scenePos().y() + pItem->boundingRect().height()/2.0)); QRectF rectF(m_startPoint, endPoint); return rectF; } return QRectF(); } QPoint RoiScene::maptoImgPos(QPointF& iscenePos) { if (!m_pImageItem) { return QPoint(); } return (m_pImageItem->mapFromScene(iscenePos) + mImgPosOffSet + QPointF(-0.5, -0.5)).toPoint(); } void RoiScene::InitShowImage(cv::Mat img) { if (!mpGraphicsView) return; if (img.empty()) return; mpShowImage = ColossusBase::convMat2QImage(img); if (!mpShowImage) return; clear(); m_pImageItem = addPixmap(QPixmap::fromImage(*mpShowImage)); mImgPosOffSet = QPoint(mpShowImage->width() / 2, mpShowImage->height() / 2); m_pImageItem->setOffset(-mpShowImage->width() / 2.0, -mpShowImage->height() / 2.0); m_pImageItem->setPos(0, 0); mImgOriSize = mpShowImage->size(); qreal scale = std::min((qreal)mpGraphicsView->width() / mImgOriSize.width(), (qreal)mpGraphicsView->height() / mImgOriSize.height()); scaleImg(scale); setSceneRect(-mImgOriSize.width() / 2, -mImgOriSize.height()/2, mImgOriSize.width(), mImgOriSize.height()); return; } void RoiScene::wheelEvent(QGraphicsSceneWheelEvent * wheelEvent) { if (!m_pImageItem) { return; } qreal numDegrees = wheelEvent->delta() / 120; qreal newScale = mpGraphicsView->transform().m11(); newScale *= std::pow(1.1, numDegrees); m_pImageItem->setTransformOriginPoint(0, 0); scaleImg(newScale); } void RoiScene::zoomImage(bool bZoomIn) { if (!mpGraphicsView) { return; } qreal degr = bZoomIn == false ? 1.2 : -1.2; qreal scale = mpGraphicsView->transform().m11(); scale *= std::pow(1.1, degr); QPointF center = mpGraphicsView->mapToScene(mpGraphicsView->width() / 2, mpGraphicsView->height() / 2); QTransform t; t.scale(scale, scale); mpGraphicsView->resetTransform(); mpGraphicsView->setTransform(t); mpGraphicsView->centerOn(center); } void RoiScene::scaleImageWithFixedViewSize() { if (!mpShowImage) { return; } QImage scaledImage; //if (!imgScaleFunc()) { scaledImage = mpShowImage->scaled(mpShowImage->width()*mFixedSizeScale, mpShowImage->height()*mFixedSizeScale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); m_pImageItem->setPixmap(QPixmap::fromImage(scaledImage.scaled(mpShowImage->width(), mpShowImage->height()), Qt::NoFormatConversion)); } // else // { // scaledImage = mImgScaleFunc(*mpImg, mFixedSizeScale, Qt::SmoothTransformation); // mpImgItem->setPixmap(QPixmap::fromImage(mImgScaleFunc(scaledImage, // 1.0 / mFixedSizeScale, Qt::FastTransformation), Qt::NoFormatConversion)); // } //emit imgScaledWithFixedSize(fixedSizeScale()); } //用于判断Item是否超出screen边界 bool RoiScene::InImgRectangel(GraphicsItem *pItem) { if (!pItem) return false; QPointF m_startPoint = maptoImgPos(QPointF(pItem->scenePos().x() - pItem->boundingRect().width() / 2.0, \ pItem->scenePos().y() - pItem->boundingRect().height() / 2.0)); QPointF endPoint = maptoImgPos(QPointF(pItem->scenePos().x() + pItem->boundingRect().width() / 2.0, \ pItem->scenePos().y() + pItem->boundingRect().height() / 2.0)); if (m_startPoint.x() < 0 || m_startPoint.y() < 0) return false; if (endPoint.x() > mImgOriSize.width() || endPoint.y() > mImgOriSize.height()) return false; mImgOriSize; return true; } void RoiScene::updateLineItem() { if (flag == 1){ float alxs = 0.0; QPoint mCenPoint = centerPoint.toPoint(); QPoint mValPoint = startPoint.toPoint(); alxs = (mCenPoint.y() - startPoint.y())*1.0 / (mCenPoint.x() - startPoint.x()); float bweight = mCenPoint.y() - alxs*mCenPoint.x(); QRectF rect = sceneRect(); QPoint mStart = QPoint(rect.x(), rect.y()); QPoint mEnd = QPoint(rect.x()+rect.width(), rect.y()+rect.height()); QPoint newPoint1, newPoint2; float y1 = alxs*mStart.x() + bweight; float x1 = (mStart.y() - bweight)*1.0 / alxs; if (y1 > mEnd.y() || y1 < mStart.y()) { float newY = alxs*x1 + bweight; newPoint1 = QPoint(x1, newY); } else { float newX = mStart.x(); newPoint1 = QPoint(newX, y1); } float y2 = alxs*mEnd.x() + bweight; float x2 = (mEnd.y() - bweight)*1.0 / alxs; if (y2 > mEnd.y() || y2 < mStart.y()) { float newY = alxs*x2 + bweight; newPoint2 = QPoint(x2, newY); } else { float newX = mEnd.x(); newPoint2 = QPoint(newX, y2); } if (newPoint2.x() < mStart.x()) { newPoint2.setY(mStart.y()); newPoint2.setX((mStart.y() - bweight) *1.0/ alxs); } QLine line(newPoint1, newPoint2); QPen pen(Qt::blue, 2); if (pLineItem) { removeItem(pLineItem); pLineItem = NULL; } pLineItem = addLine(line,pen); } else { if (pLineItem){ removeItem(pLineItem); pLineItem = NULL; } } } void RoiScene::updateTenItem(bool bFlag) { bUseTenFlag = bFlag; if (bUseTenFlag){ QLine lineV(QPoint(0, -mImgOriSize.height() / 2), QPoint(0, mImgOriSize.height() / 2)); QLine lineH(QPoint(-mImgOriSize.width() / 2, 0), QPoint(mImgOriSize.width() / 2, 0)); QPen pen(Qt::green, 5); if (pTenLineITemH) { removeItem(pTenLineITemH); pTenLineITemH = NULL; } if (pTenLineITemV) { removeItem(pTenLineITemV); pTenLineITemV = NULL; } pTenLineITemH = addLine(lineH, pen); pTenLineITemV = addLine(lineV, pen); } else { if (pTenLineITemH) { removeItem(pTenLineITemH); pTenLineITemH = NULL; } if (pTenLineITemV) { removeItem(pTenLineITemV); pTenLineITemV = NULL; } } update(); }